多个切片可以引用同一个底层数组。在某些情况下,在一个切片中添加新的数据,在原有数组无法保持更多新的数据时,将导致分配一个新的数组。而现在其他的切片还指向老的数组(和老的数据)。
上一节 我们说了:append()
函数操作后,有没有生成新的切片需要看原有切片的容量是否足够。下面,我们看看这个过程是怎么产生的:
package main
import "fmt"
func main() {
s1 := []int{1, 2, 3}
fmt.Println(len(s1), cap(s1), s1) // 输出 3 3 [1 2 3]
s2 := s1[1:]
fmt.Println(len(s2), cap(s2), s2) // 输出 2 2 [2 3]
for i := range s2 {
s2[i] += 20
}
// s2的修改会影响到数组数据,s1输出新数据
fmt.Println(s1) // 输出 [1 22 23]
fmt.Println(s2) // 输出 [22 23]
s2 = append(s2, 4) // append s2容量为2,这个操作导致了切片 s2扩容,会生成新的底层数组。
for i := range s2 {
s2[i] += 10
}
// s1 的数据现在是老数据,而s2扩容了,复制数据到了新数组,他们的底层数组已经不是同一个了。
fmt.Println(len(s1), cap(s1), s1) // 输出3 3 [1 22 23]
fmt.Println(len(s2), cap(s2), s2) // 输出3 4 [32 33 14]
}
程序输出:
3 3 [1 2 3]
2 2 [2 3]
[1 22 23]
[22 23]
3 3 [1 22 23]
3 4 [32 33 14]
下一节:map是一种元素对的无序集合,一组称为元素value,另一组为唯一键索引key。