概念
数组是具有固定长度,并且有零个或多个相同数据类型元素的序列,数组长度是数组类型的一部分,也就是说 [3]int 和 [4]int 是两个不同类型的数组,二者不可以比较,数组通过索引访问元素,Go 语言内置函数 len 可以返回数组的长度,在 Go 语言中,数组是值传递。
02
声明数组和初始化
在 Go 语言中,声明数组需要显式指定数组名称、数组长度和数组类型,默认情况下,未显示初始化一个新声明数组中的元素,数组初始值为元素类型的零值。在声明数组时,可以显式初始化数组的元素,并且可以指定索引位置和定义索引位置别名。其中,指定索引位置初始化数组元素,数组的长度为最大的索引位置数值加 1。通过代码,我们演示声明一个新数组的几种方式。
声明多维数组,仅第一维度允许使用省略号。
03
数组比较
在 Go 语言中,数组支持比较,需要注意的是,数组的长度是数组类型的一部分,也就是说 [3]int 和 [4]int 是两个不同的数据类型,不可以比较。在数组类型一致的前提下,数组之间才可以比较,并且只有数组的所有元素值全部相等,数组才相等。通过代码,我们演示数组比较的用法。
var arr6 = [5]int{1, 2, 3, 4, 5}
var arr7 = [...]int{1, 2, 3, 4, 5}
var arr8 = [5]int{2, 3, 4, 5, 6}
if arr6 == arr7 {
fmt.Println("arr6 与 arr7 相等")
} else if arr6 == arr8 {
fmt.Println("arr6 与 arr8 相等")
}
04
数组遍历
在 Go 语言中,除了使用 for 语句通过循环访问数组的索引,遍历数组元素之外,还可以使用 for...range 遍历数组,并且可以使用 “_” 忽略数组的索引。通过代码,我们演示使用 for...range 遍历数组。
var arr6 = [5]int{1, 2, 3, 4, 5}
for index, value := range arr6 {
fmt.Printf("arr6[%d]=%d\n", index, value)
}
for _, value := range arr6 {
fmt.Println("arr6=", value)
}
05
指针数组和数组指针
在 Go 语言中,指针数组是指数组的元素为指针类型的值,数组指针是指数组的内存地址。数组指针可以直接用来操作元素。通过代码,我们演示指针数组和数组指针的用法。
x, y := 1, 2
a := [2]*int{&x, &y}
p := &a
fmt.Println("数组的元素为指针类型的指针数组:", a)
fmt.Println("存储数组的内存地址的数组指针:", p)
06
数组是值传递
在 Go 语言中,数组是值传递,赋值和传参都会创建一个数组的副本,声明一个新数组,使用原数组赋值给新数组,修改原数组,新数组的元素值不改变,通过代码,我们演示数组是值传递。
var arr9 = [3]int{1, 2, 3}
var arr10 [3]int
arr10 = arr9
fmt.Println("arr9:", arr9)
fmt.Println("arr10:", arr10)
arr9[0] = 10
fmt.Println("arr9:", arr9)
fmt.Println("arr10:", arr10)
完整代码:
输出结果:
arr 数组的第一个元素是:0
arr: [0 0 0]
arr2: [1 2 3 4]
arr3 的长度:5
0 lucy
arr4: lucy
0 0 100
二维数组 arrS: [[1 2 3] [10 20 30]]
arrS2: [[[1 2 3] [4 5 6]] [[11 12 13] [14 15 16]]]
arr6 与 arr7 相等
arr6[0]=1
arr6[1]=2
arr6[2]=3
arr6[3]=4
arr6[4]=5
arr6= 1
arr6= 2
arr6= 3
arr6= 4
arr6= 5
数组的元素为指针类型的指针数组:[0xc0000b4080 0xc0000b4088]
存储数组的内存地址的数组指针:&[0xc0000b4080 0xc0000b4088]
arr9: [1 2 3]
arr10: [1 2 3]
arr9: [10 2 3]
arr10: [1 2 3]