数组的定义方式:
1、
var nums [3]int // 数组内容为{ 0, 0, 0}
这样的定义方式指定了 数组长度,默认数字类型初始值为0,字符类型为"" 其他类型为nil
2、
var nums = [...]int{1,2,3} // 数组内容为 {1, 2, 3}
如果在数组长度的位置出现的时[...]则说明数组长度不确定。
这中定义方式在定义时即指定了数组的初始值,数组的长度为初始值元素的个数
3、
var nums = [...]int{1:3, 4:3} //数组内容为{0, 3, 0, 0, 3}
这个定义方式按照索引给定初始值,其余未给定初始值的元素默认为 (0, nil, "") 数组长度为索引的最大值+1
4、
nums := make([]int,4) // 数组长度为4 内容为{0,0,0,0}
严格的说,这个方式创建的其实不是数组,而是一个len为4,cap为4的切片。但从宏观的角度来看,切片又是个动态的数组,在这个定义方式下这个切片的长度固定,也可以视为一个长度暂时为4,元素暂时全为0的数组。
数组的使用方式
遍历
遍历有两种方式 :
1、传统的循环数组下标遍历数组:
for i:= 0; i<len(array);i++{
// 处理 array[i]
}
2、迭代的方式遍历数组:
for key,value := range array{
// key =i数组下标 ,value = 数组元素
}
go 语言的range() 函数类似于python 中的 enumerate()函数。 以k-v的形式返回两个值,一个是下标,一个是值。如果range的接收变量只有一个,默认只接收下标。如果没有接收变量,也无所谓。所以方式1也可以这么用:
for i := range array{
// 处理 array[i]
}
引用
Go 语言的数组引用几乎和C一模一样,照着C来就可以。
但有一点不太一样 C 中的 array[] 是一个隐式的指向数组的指针,但Go里不能直接这么用。
数组在被当成参数传递时被是值传递。在需要传入时复制数组,将拷贝出的数组副本当作参数传入,这个副本和原来的数组内存地址不一样,传入的副本会在函数执行结束时当作临时变量与函数一起被释放。
如果函数本身需要直接对数组本身进行操作。则需要先定义一个指向数组的指针,将指针传入函数进行操作。
空数组
go 里是可以定义空数组。虽然应用较少,但这也是个比较骚的操作。空数组占用的内存空间是0。
定义方式
var d [0]int
var e = [0]int{}
var f = [...]int{}
var g = []int
数组的比较
如果数组内的元素类型是可以互相比较的,那相同长度的数组之间也可以互相比较。比较的是值。
a := [2]int{1, 2}
b := [...]int{1, 2}
c := [2]int{1, 3}
fmt.Println(a == b, a == c, b == c) // "true false false"
d := [3]int{1, 2}
fmt.Println(a == d) // compile error: cannot compare [2]int == [3]int
参考书目
[1] The Go programming Language
[2] Go语言高级编程
[3] Go官方文档