3.golang数组以及切片

数组

数组的声明

数组是具有相同 唯一类型 的一组以编号且长度固定的数据项序列。一个数组的表示形式为 T[n]。n 表示数组中元素的数量,T 代表每个元素的类型。

复制代码
var a [3]int
fmt.Println(a)

var a[3]int 声明了一个长度为 3 的整型数组。数组中的所有元素都被自动赋值为数组类型的零值。 运行上述程序将输出 [0 0 0]

数组的赋值

数组的索引从0开始到length - 1结束,进而根据索引给数组赋值。

复制代码
var a [3]int
a[1] = 18
a[2] = 19
fmt.Println(a)

给数组a索引为1的位置赋值18,索引2的位置赋值19,从而运行上述程序将输出 [0 18 19]

复制代码
a := [3]int{1, 3, 4}

以上简写模式,在定义的同时给出了赋值。

复制代码
a := [...]int{1, 3, 4}

可以忽略声明数组的长度,并用 ... 代替,让编译器为你自动计算长度。

数组的复制

Go 中的数组是值类型而不是引用类型。这意味着当数组赋值给一个新的变量时,该变量会得到一个原始数组的一个副本。如果对新变量进行更改,则不会影响原始数组。

复制代码
a := [...]int{1, 3, 4}
b := a
b[2] = 19
fmt.Println(a, b)

在上面程序中,a的副本被赋给b。b 的索引为2的元素改为19。这不会在原始数组 a 中反映出来。该程序将输出 [1 3 4] [1 3 19]

数组的遍历

for 循环可用于遍历数组中的元素。

复制代码
a := [...]int{1, 3, 4}
for i := 0; i < len(a); i++ {
	fmt.Printf(strconv.Itoa(i) + ":" + strconv.Itoa(a[i]))
	fmt.Printf("/")
}

Go 提供了一种更好、更简洁的方法,通过使用 for 循环的 range 方法来遍历数组。range 返回索引和该索引处的值。

复制代码
a := [...]int{1, 3, 4}
for i, v := range a {
	fmt.Printf(strconv.Itoa(i) + ":" + strconv.Itoa(v))
	fmt.Printf("/")
}

多维数组

go支持声明多维数组。

复制代码
a := [3][2]int{
	{1, 1},
	{2, 2},
	{3, 3},
}
fmt.Print(a)

该程序将输出 [[1 1] [2 2] [3 3]]

切片

切片(slice)是对数组一个连续片段的引用,所以切片是一个引用类型。切片是一个 长度可变的数组。

创建切片

复制代码
a := [5]int{76, 77, 78, 79, 80}
var b []int = a[1:4]
fmt.Print(b)

使用语法 a[start:end] 创建一个从 a 数组索引 start 开始到 end - 1 结束的切片。因此,a[1:4] 为从索引 1 到 3 创建了 a 数组的一个切片表示。因此, 切片 b的值为 [77 78 79]。
便捷创建切片

复制代码
c := []int{6, 7, 8}
fmt.Println(c)

在上面程序中,c:= [] int {6,7,8} 创建一个有 3 个整型元素的数组,并返回一个存储在 c中的切片引用。

切片的修改

切片自己不拥有任何数据。它只是底层数组的一种表示。对切片所做的任何修改都会反映在底层数组中。

复制代码
a := [5]int{76, 77, 78, 79, 80}
b := a[1:4]
fmt.Println("before", a)
for i, _ := range b {
	b[i]++
}
fmt.Println("after", a)

for 循环将这些索引中的值逐个递增。当重新使用 for 循环打印数组时,可以看到对切片的更改反映到了数组中。该程序的输出为:

复制代码
before [76 77 78 79 80]
after [76 78 79 80 80]

切片的长度

len()是获取切片底层数组的长度,cap()获取切片的长度。

复制代码
a := [5]int{76, 77, 78, 79, 80}
b := a[1:4]
fmt.Println("len", len(b))
fmt.Println("cap", cap(b))

该程序输出为 len 3 cap 4。

切片追加元素

数组的长度是固定的,它的长度不能增加。切片是动态的,使用append()可以将新元素追加到切片上。

复制代码
a := [5]int{76, 77, 78, 79, 80}
b := a[1:4]
b = append(b, 8)
fmt.Println(b)

该程序输出为 [77 78 79 8]。

相关推荐
BlockChain8884 小时前
Solidity 实战【三】:重入攻击与防御(从 0 到 1 看懂 DAO 事件)
go·区块链
源代码•宸6 小时前
Golang原理剖析(defer、defer面试与分析)
开发语言·经验分享·后端·面试·golang·defer·开放编码
且去填词7 小时前
三色标记法与混合写屏障:Go GC 垃圾回收全流程解析
开发语言·算法·golang·三色标记法·gogc·屏障技术
源代码•宸8 小时前
Golang原理剖析(interface)
服务器·开发语言·后端·golang·interface·type·itab
剩下了什么9 小时前
Gf命令行工具下载
go
汪碧康9 小时前
一文掌握k8s容器的资源限制
docker·云原生·容器·golang·kubernetes·k8s·xkube
地球没有花9 小时前
tw引发的对redis的深入了解
数据库·redis·缓存·go
BlockChain88820 小时前
字符串最后一个单词的长度
算法·go
龙井茶Sky21 小时前
通过higress AI统计插件学gjson表达式的分享
go·gjson·higress插件
moxiaoran57531 天前
Go语言的错误处理
开发语言·后端·golang