数组初始化
var a [3]int //3个整数数组,初始化值0,0,0
[5] int {1,2,3,4,5} //长度为5的数组,其元素值依次为:1,2,3,4,5
[5] int {1,2} //长度为5的数组,其元素值依次为:1,2,0,0,0 。在初始化时没有指定初值的元素将会赋值为其元素类型int的默认值0,string的默认值是""
[...] int {1,2,3,4,5} //长度为5的数组,其长度是根据初始化时指定的元素个数决定的
[5] int { 2:1,3:2,4:3} //长度为5的数组,key:value,其元素值依次为:0,0,1,2,3。在初始化时指定了2,3,4索引中对应的值:1,2,3
[...] int {2:1,4:3} //长度为5的数组,起元素值依次为:0,0,1,0,3。由于指定了最大索引4对应的值3,根据初始化的元素个数确定其长度为5
数组的长度是数组的一部分,所以 [3]int 和 [5]int是两个不同的数组类型。
数组的长度必须是常量表达式, 这个值是在编译时确定的。
q := [3]int{1,2,3}
q = [4]int{1,2,3,4} //编译错误,q现在是[3]int, 和 [4]int是不同的类型
如果一个数组的元素是可比较的,那这个数组也是可比较的,用 == 操作符比较两个数组,比较的是元素值是否完全相同。
Go把数组和其它的类型都看成是值传递,其它语言中,数组是隐式使用引用。
也可以显示地传递一个数组的指针给函数,这样在函数内部对数组的修改会反映到原始数组。
func zero (ptr *[3]byte){
for i := range ptr{
ptr[i] = 0
}
}
func zero (ptr *[32]byte){
*ptr = [32]byte{}
}
使用数组指针是高效的,同时允许被调函数修改调用方数组中的元素,但由于数组的长度不可变,除特殊情况,我们很少使用数组。
遍历
attr1 := [3]string{}
arr2 := [4]string{"a", "b", "c", "d"}
for i := 0; i < len(arr2); i++ {
fmt.Print(arr4[i], "\t")
}
for _, value := range arr1 {
fmt.Print(value, "\t")
}