切片的地址
func main() {
var slice []int
slice = append(slice, 1, 2, 3, 4)
fmt.Printf("%p\n", slice)
slice = append(slice, 1, 2, 3, 4)
fmt.Printf("%p\n", slice)
}
运行结果:
切片的地址不一定是不变的。
如果切片在未扩容前后面的地址被使用了,扩容后切片的地址就可能发生变化。
切片的扩容
func main() {
s := make([]int, 0, 1)
oldcap := cap(s)
for i := 0; i < 20000; i++ {
s = append(s, i)
newcap := cap(s)
if oldcap < newcap {
fmt.Printf("cap:%d === %d\n", oldcap, newcap)
oldcap = newcap
}
}
}
运行结果:
在使用append追加数据的时候,长度超过容量,容量自动扩容
一般 新容量 = 旧容量 * 2
如果超过1024字节,每次扩容上一次的1/4
容量扩容必为偶数