slice数据结构
type slice struct {
array unsafe.Pointer //指向引用数组指针
len int //长度
cap int // 容量
}
slice扩容逻辑
1.如果slice容量足够容纳新增的元素,那么不会扩容。
2.如果新增元素后容量不足,则会扩容为原容量的 2 倍大小,如果原 slice 容量大于1024,那扩容后的容量等于每次扩容前增加 1/4。同时将原来的数据拷贝到新的数组中,所以还是要合理使用扩容。
易错点
1.slice在扩容后会重新开辟一片内存地址,将原先值拷贝到新的地址,再次修改slice将不会影响原先的slice
2.slice当作参数传递时,虽然是值传递,但是其内部结构存在指针,指向的还是同一个数组引用,所有函数内部改变slice会影响原先值
slice的两种声明方式
var a []int
a:=make([]int,0)
其中第一个声明后,是Nil Slice,第二个声明后,是Empty Slice
1.Nil Slice:代表不存在的slice
2.Empty Slice:代表存在的空数组地址
网友评论