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