golang中slice的知识点

扩容机制

  • 如果slicecap小于1024, 扩容会为cap的2倍
  • 如果slicecap大于等于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 int
	len int
}

// 创建
slice := make([]int, len) //cap = len
slice := make([]int, len, cap)

slice copy()

golang内置的深拷贝copy(dst, src), 只能用于切片

  1. 使用copy()内置函数拷贝两个切片时,会将源切片的数据逐个拷贝到目的切片指向的数组中;
  2. 拷贝数量取两个切片长度的最小值,即是说如说len(dst)不够长,就只能复制部分src的内容(配合3.理解);
  3. copy过程中不会发生扩容;

你可能感兴趣的:(Goland,golang,数据结构,开发语言)