第一种声明方式
var firstArray [2] int
fmt.Println(firstArray[0])
firstArray[1] = 1
fmt.Println(firstArray[1])
这是第一种数组声明方式,未初始化的元素值默认为0,需要指明数组的长度,然后使用下标索引方式初始化和访问元素。
简洁的方式
我们知道Java中数组还有这种初始化方式,直接初始化具体元素,数组长度自动获得:
int[] intArray = new int[]{1, 2, 3, 4, 5};
对应在Go中是这样的:
secondArray := [...]int{1, 2, 3, 4, 5}
//数组的循环
for index, item := range secondArray {
fmt.Println(index, item)
}
for i := 0; i < len(secondArray); i++ {
fmt.Println(i, secondArray[i])
}
有点怪异,不习惯,第一次使用还有可能会把[...]中的...省略了,如果省略了,那就不是一个数组了,而是一个slice,可以用下面的代码验证一下:
fmt.Println(reflect.TypeOf([]int{1, 2}))
fmt.Println(reflect.TypeOf([...]int{1, 2}))
输出结果是:[]int和[2]int。看着又是很相似的结果,但[]int是slice,[2]int是数组,中括号中有数字表示是数组。
SLICE
说到slice,slice是什么?先看下slice怎么得到:
sliceOfArray = secondArray[0:1]
fmt.Println(reflect.TypeOf(sliceOfArray)
上面的输出结果也是[]int,和上一段代码:fmt.Println(reflect.TypeOf([]int{1, 2}))输出是一样的。这个slice和Python里的列表slice很像(Java数组没有slice功能,只能用apache-commons中的ArrayUtils实现类似功能):
int_list = [1, 2, 3, 4, 5]
sub_list = int_list[0:1]
#python的slice更灵活
print(int_list[0:])
print(int_list[:3])
print(int_list[0:-1])
从表面使用上看的话,就是取子数组或子列表的功能,但更深入看,Python中的列表slice操作返回的是一个新的子列表,而Go中slice操作返回的不是一个新的子数组,而是一个和原数组共用内存的slice,这样的设计可以减少切片操作时的内存消耗,提高性能,这里我们可以把生成的slice看做的原数组的一个子片断视图,它本身不存数据,访问到的元素,还是原数组里的元素。