前言
一、代码
package main
import "fmt"
func main(){
a := make([]byte, 10)
for i := 0; i < 10; i++{
a[i] = byte(i)
}
b := a[2:5]
fmt.Println("切片b")
fmt.Printf("a:%d\nb:%d\na len:%d, a cap:%d, b len:%d, b cap:%d\n", a, b, len(a), cap(a), len(b), cap(b))
c := make([]byte, 2)
b = append(b, c...)
fmt.Println("追加c")
fmt.Printf("a:%d\nb:%d\na len:%d, a cap:%d, b len:%d, b cap:%d\n", a, b, len(a), cap(a), len(b), cap(b))
d := make([]byte, 5)
b = append(b, d...)
fmt.Println("追加d")
fmt.Printf("a:%d\nb:%d\na len:%d, a cap:%d, b len:%d, b cap:%d\n", a, b, len(a), cap(a), len(b), cap(b))
e := make([]byte, 7)
b = append(b, e...)
fmt.Println("追加e")
fmt.Printf("a:%d\nb:%d\na len:%d, a cap:%d, b len:%d, b cap:%d\n", a, b, len(a), cap(a), len(b), cap(b))
}
二、输出
切片b
a:[0 1 2 3 4 5 6 7 8 9]
b:[2 3 4]
a len:10, a cap:10, b len:3, b cap:8
追加c
a:[0 1 2 3 4 0 0 7 8 9]
b:[2 3 4 0 0]
a len:10, a cap:10, b len:5, b cap:8
追加d
a:[0 1 2 3 4 0 0 7 8 9]
b:[2 3 4 0 0 0 0 0 0 0]
a len:10, a cap:10, b len:10, b cap:16
追加e
a:[0 1 2 3 4 0 0 7 8 9]
b:[2 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
a len:10, a cap:10, b len:17, b cap:32
三、结论
对 slice 进行切片时,假设原 slice 为 a,对 a 切片 [i:j] 为 b, b 会和原 a 共享底层数组,b的容量 = a容量 - i
。此时对 b 进行操作,分以下几种情况
- 若对 b 追加后的长度小于 b 的容量,会直接修改底层数组, a 也会跟着改变。
- 若对 b 追加后的长度大于 b 的容量,会新建一个容量为原来容量 n 倍(新容量足以容纳所有元素)的 slice 并追加内容,a 不会被修改。