12.3 陈旧的切片

多个切片可以引用同一个底层数组。在某些情况下,在一个切片中添加新的数据,在原有数组无法保持更多新的数据时,将导致分配一个新的数组。而现在其他的切片还指向老的数组(和老的数据)。

上一节 我们说了: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。