在初学 go 语言时,很多人对数组和切片的理解不是很清楚,很多时候感觉是一样的。
那么,数组和切片到底有什么不同之处呢?
首先,我们看看他们有什么共同点。数组和切片都是用来存储一批某一类型数据的,是属于集合类的类型。 知道了共同点,那我们将看看他们之间的不同点。
数组的长度是固定的,切片长度是变长的。
数组的长度是类型的一部分,比如:[1]int 与 [2]int 为不同的类型。 切片的字面量中只有元素,没有长度。
切片的底层实现是数组,是对某一连续片段的引用。切片的长度可以通过内建的 len 方法来获取,通过 cap 方法获取切片的容量。
当使用 append 往切片中添加数据时,切片会根据数据长度和容量进行动态的扩容。 在 append 后,如果当前无须扩容,这 append 会返回指向原底层数组的原切片。当需要扩容后,将返回指向新底层数组的新的切片。这就是为什么我们在调用 append 的时候,需要将结果重新赋值回去的原因。
切片的扩容策略,在原切片长度小于或等于 1024 时,新切片的新容量为原来的 2 倍,当原切片长度大于 1024 后,将以原容量的 1.25 倍作为新切片的基准容量。