>

本文介绍 Go 语言中 array 和 slice 的区别。

在 Go 的官方指南中指出:Arrays are not often seen in Go programs because the size of an array is part of its type, which limits its expressive power.
由于声明 array 时需要指定 size 大小,size 是 array 类型的一部分,这极大地限制了它的表达能力,所以在 Go 程序中很少见到使用 array 的情况。

array 和 slice 最明显的一个区别体现在申明方式上:
array 声明时需要指定大小,什么方式是:[2]int{1, 2} 或者 [...]int{1, 2, 3}。生成的对象是 [num]type 类型(比如: [2]int 和 [3]int 是两种完全不同的类型。)
然而, slice 申明时则无需指定大小, 使用[]int{1, 2, 3} 或者 make([]int, len, cap) 这种方式来声明即可。

同时,不能使用 array 类型的变量返回给 slice。

e.g.

1
2
3
4
func testArray() []int {
arr := [2]int{1, 2}
return arr // error: cannot use arr (type [2]int) as type []int
}

如果我们一定要使用上述方式,我们可以使用 arr[:] 来把 array 描述成 slice, 把上述 return arr 改成 return arr[:] 之后就可以了。
当然,还可以使用 arr[i:len(arr)] 来表示,其余 arr[:] 效果完全一样。