扩容机制
- 如果slice
cap
小于1024, 扩容会为cap
的2倍 - 如果slice
cap
大于等于1024, 扩容会为cap
的1.25倍
验证:
sl1 := make([]int32, 1024) sl2 := make([]int32, 512) fmt.Println("cap:", cap(sl1), " len:", len(sl1)) fmt.Println("cap:", cap(sl2), " len:", len(sl2)) sl1 = append(sl1, 1) sl2 = append(sl2, 1) fmt.Println("cap:", cap(sl1), " len:", len(sl1)) fmt.Println("cap:", cap(sl2), " len:", len(sl2)) //output: /* cap: 1024 len: 1024 cap: 512 len: 512 cap: 1344 len: 1025 cap: 1024 len: 513 */
slice线程不安全
配合下一个知识点slice数据结构
食用, slice是没有锁的
slice数据结构
package runtime // ... type slice struct{
array unsafe.Pointer cap nt
len int
}
// 创建
slice := make([]int, len) //cap = len
slice := make([]int, len, cap)
slice copy()
golang内置的深拷贝copy(dst, src)
,
- 使用copy()内置函数拷贝两个切片时,会将源切片的数据逐个拷贝到目的切片指向的数组中;
- 拷贝数量取两个切片长度的最小值,即是说如说
len(dst)
不够长,就只能复制部分src
的内容(配合3.理解); - copy过程中不会发生扩容;