切片复制
切片只复制底层的结构,不复制底层的数据,因为多个slice之间可以共享底层的数据,并且引用的数组部分区间可能重叠
- 切片的底层结构
type SliceHeader struct {
Data uintptr //指针:指向第一个slice元素对应的底层数组元素的地址
Len int //长度:slice中元素的数目
Cap int //容量:从slice的开始位置到底层数据的结尾位置
}
- 例子:
months := [...]string{1: "January", /* ... */, 12: "December"}
Q2 := months[4:7]
summer := months[6:9]
fmt.Println(Q2) // ["April" "May" "June"]
fmt.Println(summer) // ["June" "July" "August"]
所以当你进行复制只改了一个 SliceHeader,但是当你对summer进行更改时,会不会对months,Q2进行更改
data := [...]int{1,2,3,4,5,6,7}
copy1 := data[1:3]
copy2 := data[4:6]
fmt.Println(data,copy1,copy2)
copy1[1] = 999
fmt.Println(data,copy1,copy2)
data := [...]int{1,2,3,4,5,6,7}
copy1 := data[1:3]
copy2 := data[3:6]
fmt.Println(data,copy1,copy2)
copy1 = append(copy1, 999)
fmt.Println(data,copy1,copy2)
data := [...]int{1,2,3,4,5,6,7}
copy1 := data[1:3]
copy2 := data[3:7]
fmt.Println(data,copy1,copy2)
copy2 = append(copy2, 999)
fmt.Println(data,copy1,copy2)
copy2的append就没修改data和copy1的值,因为copy2append之后超过原来的Cap的值
data := [...]int{1, 2, 3, 4, 5,6, 7}
copy2 := data[3:7]
fmt.Println(data, copy2)
fmt.Println(cap(copy2), len(copy2)) // cap为4,len为4
copy2 = append(copy2, 999) //len = 5 > cap ,需要重新开辟一倍内存控件
fmt.Println(cap(copy2), len(copy2))
fmt.Println(data, copy2)
当len<cap的时候不会重新开辟空间,还共享底层数据,当len>cap就会重新开辟空间,就不共享底层数据了