Go 之 语言基本类型

一、基本类型及其特性和用途

类型长度(字节)默认值说明
bool1false布尔值,表示真假
byte10别名为 uint8,用于表示ASCII字符或其他小整数值
rune40别名为 int32,表示一个Unicode码点
intuint4 或 80有符号和无符号整数,具体长度取决于系统架构(32位或64位系统)
int8uint810有符号范围:-128 ~ 127;无符号范围:0 ~ 255,byte 是 uint8 的别名
int16uint1620有符号范围:-32,768 ~ 32,767;无符号范围:0 ~ 65,535
int32uint3240有符号范围:-2,147,483,648 ~ 2,147,483,647;无符号范围:0 ~ 4,294,967,295,rune 是 int32 的别名
int64uint6480有符号范围:-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807;无符号范围:0 ~ 18,446,744,073,709,551,615
float3240.0单精度浮点数
float6480.0双精度浮点数
complex648复数,实部和虚部都是 float32
complex12816复数,实部和虚部都是 float64
uintptr4 或 8用于存储指针的整数类型,具体长度取决于系统架构
array--固定大小的数组,值类型
struct--结构体,包含多个字段的聚合类型,值类型
string-""UTF-8 编码的字符串,值类型
slice-nil动态大小的数组,引用类型
map-nil键值对集合,引用类型
channel-nil用于goroutine之间通信的通道,引用类型
interface-nil接口类型,定义了一组方法集
function-nil函数类型,可以作为参数传递或返回

二、byte 和 rune 区别

  • byte:适用于处理ASCII字符或单字节数据,通常用于处理纯英文文本或简单的二进制数据。
  • rune:适用于处理Unicode字符,特别是包含多字节字符的语言(如中文、日文等)。在处理复杂的字符串操作时,建议使用 rune 类型以确保字符的正确解析。

案例:

package main

import (
    "fmt"
)

func main() {
    str := "Hello你好"

    // 使用 byte 类型遍历字符串
    fmt.Println("Using byte:")
    for i := 0; i < len(str); i++ {
        fmt.Printf("Character: '%c', value: %d\n", str[i], str[i])
    }

    // 使用 rune 类型遍历字符串
    fmt.Println("\nUsing rune:")
    for _, r := range str {
        fmt.Printf("Character: '%c', value: %d\n", r, r)
    }
}

// 输出

Using byte:
Character: 'H', value: 72
Character: 'e', value: 101
Character: 'l', value: 108
Character: 'l', value: 108
Character: 'o', value: 111
Character: 'ä', value: 228
Character: '½', value: 189
Character: '?', value: 63

Using rune:
Character: 'H', value: 72
Character: 'e', value: 101
Character: 'l', value: 108
Character: 'l', value: 108
Character: 'o', value: 111
Character: '你', value: 20320
Character: '好', value: 22909

使用 byte 类型遍历时,由于字符串包含多字节字符(如“你好”),会出现乱码现象;而使用 rune 类型遍历时,则能正确解析每个字符。

三、new 与 make 的区别

特性new(T)make(T, args...)
适用类型任何类型,包括结构体、数组、基本类型仅适用于切片、映射和通道
返回值返回 *T(指向 T 的指针)返回 T(类型本身,已初始化)
初始化方式零值初始化根据参数进行初始化
用途分配内存并返回指针创建并初始化切片、映射或通道
package main

import (
    "fmt"
)

func main() {
    // 使用 new 创建映射指针
    mNew := new(map[string]int)
    fmt.Printf("%v, %T\n", mNew, mNew) // 输出: &map[], *map[string]int
    fmt.Println(*mNew)                 // 输出: map[] (实际上是 nil)

    // 尝试直接对 nil 映射进行赋值会导致 panic
    // (*mNew)["key"] = 10 // 这行代码会引发 panic

    // 方法1:使用 make 初始化映射,并将其赋值给指针指向的映射
    *mNew = make(map[string]int)
    (*mNew)["key"] = 10
    fmt.Println(*mNew) // 输出: map[key:10]

    // 方法2:使用字面量初始化映射,并将其赋值给指针指向的映射
    *mNew = map[string]int{"anotherKey": 20}
    fmt.Println(*mNew) // 输出: map[anotherKey:20]

    // 使用 make 创建映射
    mMake := make(map[string]int)
    fmt.Printf("%v, %T\n", mMake, mMake) // 输出: map[], map[string]int
    mMake["key"] = 10
    fmt.Println(mMake) // 输出: map[key:10]

    // 也可以将 mMake 赋值给 mNew 指向的映射
    *mNew = mMake
    (*mNew)["key"] = 30
    fmt.Println(*mNew) // 输出: map[key:30]
}

综上像 slice、map、channel 这三种还是用make比较合适。

四、array 数组

1、初始化数组

// 初始化一个包含5个整数的数组
arr := [5]int{1, 2, 3, 4, 5} 

// 初始化前两个元素,其余为0 // 结果: [1, 2, 0, 0, 0]
arr := [5]int{1, 2} 

// 编译器会自动推断数组长度为5
arr := [...]int{1, 2, 3, 4, 5} 

// 赋值3和4位置得值 ["", "", "", "hello world", "tom"]
var str = [5]string{3: "hello world", 4: "tom"} 

2、多维数组

// 声明一个二维数组
matrix := [2][3]int{
    {1, 2, 3},
    {4, 5, 6},
}

// 使用省略号自动推断长度,注意 第 2 纬度不能用 "..."
matrix := [...][3]int{
    {1, 2, 3},
    {4, 5, 6},
}

3、遍历数组

arr := [5]int{1, 2, 3, 4, 5}


// for 模式
for i := 0; i < len(arr); i++ {
    fmt.Printf("arr[%d] = %d\n", i, arr[i])
}

// range 模式
for i, v := range arr {
    fmt.Printf("arr[%d] = %d\n", i, v)
}

五、slice 切片

        切片是对底层数组的一个引用,因此多个切片可以共享同一个底层数组。长度(length)表示切片中当前元素的数量。 容量(capacity)表示切片底层数组中从切片起始位置到数组末尾的元素数量。

1、切片的创建、初始化、遍历、修改以及常见操作

package main

import (
    "fmt"
)

func main() {
    // 使用 make 创建切片
    s1 := make([]int, 5, 10)
    fmt.Println("s1:", s1) // 输出: [0 0 0 0 0]

    // 直接初始化切片
    s2 := []int{1, 2, 3, 4, 5}
    fmt.Println("s2:", s2) // 输出: [1 2 3 4 5]

    // 从数组创建切片
    arr := [6]int{1, 2, 3, 4, 5, 6}
    s3 := arr[1:4]
    fmt.Println("s3:", s3) // 输出: [2 3 4]

    // 遍历切片
    for i, v := range s2 {
        fmt.Printf("s2[%d] = %d\n", i, v)
    }

    // 修改切片元素
    s2[0] = 10
    fmt.Println("After modification:", s2) // 输出: [10 2 3 4 5]

    // 添加元素
    s2 = append(s2, 6, 7, 8)
    fmt.Println("After append:", s2) // 输出: [10 2 3 4 5 6 7 8]

    // 删除元素
    s2 = append(s2[:2], s2[3:]...)
    fmt.Println("After removing element at index 2:", s2) // 输出: [10 2 4 5 6 7 8]

    // 复制切片
    dst := make([]int, 3)
    n := copy(dst, s2)
    fmt.Println("Copied slice:", dst) // 输出: [10 2 4]
    fmt.Println("Number of elements copied:", n) // 输出: 3

    // 切片的切片
    subSlice := s2[1:4]
    fmt.Println("Sub-slice:", subSlice) // 输出: [2 4 5]
}
  • 创建:可以使用 make 函数创建切片,或者直接初始化切片。
  • 初始化:可以直接在声明时初始化切片元素,或者从现有数组中创建切片。
  • 访问和修改:通过索引访问和修改切片中的元素。
  • 遍历:可以使用 for 循环或 range 来遍历切片。
  • 添加元素:使用 append 函数向切片添加元素。
  • 删除元素:可以通过切片操作符删除元素。
  • 复制切片:使用 copy 函数将一个切片的内容复制到另一个切片中。
  • 切片的切片:可以从一个切片中创建另一个切片。

2、切片得常规操作

操作含义
s[n]访问切片 s 中索引位置为 n 的项。
s[:]从切片 s 的索引位置 0 到 len(s)-1 处所获得的切片(即整个切片)。
s[low:]从切片 s 的索引位置 low 到 len(s)-1 处所获得的切片。
s[:high]从切片 s 的索引位置 0 到 high 处所获得的切片,长度为 high
s[low:high]从切片 s 的索引位置 low 到 high 处所获得的切片,长度为 high - low
s[low:high:max]从切片 s 的索引位置 low 到 high 处所获得的切片,长度为 high - low,容量为 max - low
len(s)返回切片 s 的长度,表示当前包含的元素数量,总是小于等于 cap(s)
cap(s)返回切片 s 的容量,表示底层数组中从切片起始位置到数组末尾的元素数量,总是大于等于 len(s)
package main

import (
    "fmt"
)

func main() {
    s := []int{1, 2, 3, 4, 5}

    // 访问切片s中索引位置为2的项
    fmt.Println("s[2]:", s[2]) // 输出: 3

    // 获取整个切片
    fmt.Println("s[:]:", s[:]) // 输出: [1 2 3 4 5]

    // 获取从索引位置1到末尾的切片
    fmt.Println("s[1:]:", s[1:]) // 输出: [2 3 4 5]

    // 获取从索引位置0到3的切片
    fmt.Println("s[:3]:", s[:3]) // 输出: [1 2 3]

    // 获取从索引位置1到3的切片
    fmt.Println("s[1:3]:", s[1:3]) // 输出: [2 3]

    // 获取从索引位置1到3且最大容量为4的切片
    fmt.Println("s[1:3:4]:", s[1:3:4]) // 输出: [2 3]

    
    s := make([]int, 3, 5) // 创建一个长度为3,容量为5的切片
    s = append(s, 4, 5)    // 添加两个元素

    fmt.Println("s:", s)           // 输出: [0 0 0 4 5]
    fmt.Println("len(s):", len(s)) // 输出: 5
    fmt.Println("cap(s):", cap(s)) // 输出: 5

    // 获取从索引位置1到3的切片
    // 子切片的容量由底层数组的容量减去子切片的起始索引决定,所以 cap 容量 5-1
    subSlice := s[1:3]
    fmt.Println("subSlice:", subSlice)          // 输出: [0 0]
    fmt.Println("len(subSlice):", len(subSlice)) // 输出: 2
    fmt.Println("cap(subSlice):", cap(subSlice)) // 输出: 4
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/977388.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

修改与 Git 相关的邮箱

要修改与 Git 相关的邮箱信息&#xff0c;需要区分以下两种情况&#xff1a; 1. 修改 Git 提交时使用的邮箱&#xff08;影响提交记录&#xff09; Git 提交记录中的邮箱由本地 Git 配置的 user.email 决定&#xff0c;与 SSH 密钥无关。修改方法如下&#xff1a; 全局修改&a…

用PyTorch从零构建 DeepSeek R1:模型架构和分步训练详解

DeepSeek R1 的完整训练流程核心在于&#xff0c;在其基础模型 DeepSeek V3 之上&#xff0c;运用了多种强化学习策略。 本文将从一个可本地运行的基础模型起步&#xff0c;并参照其技术报告&#xff0c;完全从零开始构建 DeepSeek R1&#xff0c;理论结合实践&#xff0c;逐步…

基于SpringBoot的“流浪动物救助系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“流浪动物救助系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统…

从零开始玩转TensorFlow:小明的机器学习故事 5

图像识别的挑战 1 故事引入&#xff1a;小明的“图像识别”大赛 小明从学校里听说了一个有趣的比赛&#xff1a;“美食图像识别”。参赛者需要训练计算机&#xff0c;看一张食物照片&#xff08;例如披萨、苹果、汉堡等&#xff09;&#xff0c;就能猜出这是什么食物。听起来…

学习笔记--电磁兼容性EMC

一、基本概念 电磁兼容性&#xff08;Electromagnetic Compatibility&#xff0c;EMC&#xff09;是电子电气设备在特定电磁环境中正常工作的能力&#xff0c;同时不会对其他设备产生不可接受的电磁干扰。其核心目标是确保设备在共享的电磁环境中既能抵抗干扰&#xff0c;又能避…

unity学习51:所有UI的父物体:canvas画布

目录 1 下载资源 1.1 在window / Asset store下下载一套免费的UI资源 1.2 下载&#xff0c;导入import 1.3 导入后在 project / Asset下面可以看到 2 画布canvas&#xff0c;UI的父物体 2.1 创建canvas 2.1.1 画布的下面是 event system是UI相关的事件系统 2.2 canvas…

ArcGIS Pro中创建最低成本路径的详尽教程

一、引言 在地理信息系统&#xff08;GIS&#xff09;的应用场景中&#xff0c;路径分析扮演着至关重要的角色。而最低成本路径分析&#xff0c;则是路径分析中的一种高级应用&#xff0c;它综合考虑了地形、植被、土地利用类型等多种因素&#xff0c;通过加权计算得出一条从起…

地铁站内导航系统:基于蓝牙Beacon与AR技术的动态路径规划技术深度剖析

本文旨在分享一套地铁站内导航系统技术方案&#xff0c;通过蓝牙Beacon技术与AI算法的结合&#xff0c;解决传统导航定位不准确、路径规划不合理等问题&#xff0c;提升乘客出行体验&#xff0c;同时为地铁运营商提供数据支持与增值服务。 如需获取校地铁站内智能导航系统方案文…

在VSCode中接入deepseek

注册就送14元2000万tokens。 https://cloud.siliconflow.cn/i/rnbA6i6U各种大模型 下面介绍我是如如接入vscode的 左边生成一个key&#xff0c;呆会vscode要用&#xff0c;不然401. 打开vscod&#xff0c;电脑能上网。下插件。 下好要配置 点它一下。 要配置&#xff0c;全…

【Java项目】基于Spring Boot的简历系统

【Java项目】基于Spring Boot的简历系统 技术简介&#xff1a;采用Spring Boot框架、Java技术、MySQL数据库等实现。 系统简介&#xff1a;系统主要实现了管理员模块、用户模块二大部分。管理员登录进入简历系统可以查看首页、个人中心、用户管理、简历模板管理、模板类型管理、…

汽车零部件工厂如何通过ESD监控系统闸机提升产品质量

在汽车零部件工厂的生产过程中&#xff0c;静电带来的危害不容小觑。从精密的电子元件到复杂的机械部件&#xff0c;静电都可能成为影响产品质量的 “隐形杀手”。而 ESD 监控系统闸机的出现&#xff0c;为汽车零部件工厂解决静电问题、提升产品质量提供了关键的技术支持。 一、…

记录:Docker 安装记录

今天在安装 ollama 时发现无法指定安装目录&#xff0c;而且它的命令行反馈内容很像 docker &#xff0c;而且它下载的模型也是放在 C 盘&#xff0c;那么如果我 C 盘空间不足&#xff0c;就装不了 deepseek-r1:70b &#xff0c;于是想起来之前安装 Docker 的时候也遇到过类似问…

DPVS-5: 后端服务监控原理与测试

后端监控原理 被动监测 DPVS自带了被动监控&#xff0c;通过监控后端服务对外部请求的响应情况&#xff0c;判断服务器是否可用。 DPVS的被动监测&#xff0c;并不能获取后端服务器的详细情况&#xff0c;仅仅通过丢包/拒绝情况来发觉后端服务是否可用。 TCP session state…

第438场周赛:判断操作后字符串中的数字是否相等、提取至多 K 个元素的最大总和、判断操作后字符串中的数字是否相等 Ⅱ、正方形上的点之间的最大距离

Q1、判断操作后字符串中的数字是否相等 1、题目描述 给你一个由数字组成的字符串 s 。重复执行以下操作&#xff0c;直到字符串恰好包含 两个 数字&#xff1a; 从第一个数字开始&#xff0c;对于 s 中的每一对连续数字&#xff0c;计算这两个数字的和 模 10。用计算得到的新…

计算机毕业设计SpringBoot+Vue.js学科竞赛管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

2.24力扣-回溯电话号码的字母组合

17. 电话号码的字母组合 - 力扣&#xff08;LeetCode&#xff09; class Solution {List<String> ans new LinkedList<>();StringBuilder temp new StringBuilder();public List<String> letterCombinations(String digits) {if(digitsnull || digits.leng…

在PyCharm中集成AI编程助手并嵌入本地部署的DeepSeek-R1模型:打造智能开发新体验

打造智能开发新体验&#xff1a;DeepSeekPycharmollamaCodeGPT 目录 打造智能开发新体验&#xff1a;DeepSeekPycharmollamaCodeGPT前言一、什么是ollama&#xff1f;二、如何使用1.进入ollama官方网站:2.点击下载ollama安装包3.根据默认选项进行安装4.安装成功5.打开命令提示符…

游戏引擎学习第120天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上次回顾&#xff1a;周期计数代码 我们正在进行一个项目的代码优化工作&#xff0c;目标是提高性能。当前正在优化某个特定的代码片段&#xff0c;已经将其执行周期减少到48个周期。为了实现这一目标&#xff0c;我们设计了一个…

三级等保|三级等保认证|三级等保申请

在信息化时代&#xff0c;信息安全已成为企业及组织不可缺的重要环节。三级等保作为我国信息安全等级保护体系中的重要组成部分&#xff0c;其办理过程需严格遵守相关法律法规和标准。以下是在办理三级等保过程中需要注意的若干事项&#xff1a; 一、明确等级保护对象 首先&…

基于 SpringBoot 的 “电影交流平台小程序” 系统的设计与实现

大家好&#xff0c;今天要和大家聊的是一款基于 SpringBoot 的 “电影交流平台小程序” 系统的设计与实现。项目源码以及部署相关事宜请联系我&#xff0c;文末附上联系方式。 项目简介 基于 SpringBoot 的 “电影交流平台小程序” 系统设计与实现的主要使用者分为 管理员 和…