我的 golang 学习笔记系列一:什么是切片
切片定义
- Go 语言切片是对数组的抽象。
- Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
切片的容量与长度
切片扩容的规则源码位置:/usr/local/go/src/runtime/slice.go 下的 growslice 函数
容量和长度的关系:初始时切片的容量和长度是相同的,如果切片的长度增加,已有容量不足以满足长度,则go底层会将容量增加一倍,增加方式为copy出一个新的,旧的会被释放掉(大于1024之后规则有所变化),以满足长度增加,示例如下:
func TestArr(t *testing.T) { arr1 :=[]int{1,2,3,4} // cap 获取切片的容量 // len 获取切片的长度 // fmt.Printf("切片arr1:的容量 %v,长度为:%v, 地址为:%p \n" ,cap(arr1),len(arr1),&arr1) // append 像切片中追加新元素 可以追加多个 // arr2 并不是一个引用 arr1的值,是go底层copy出的一个新的值 arr2 := append(arr1,22,33) fmt.Printf("切片arr2的容量2:%v,长度为:%v, 地址为:%p \n",cap(arr2),len(arr2),&arr2) // 初始时切片的容量和长度是相同的,如果切片的长度增加,已有容量不足以满足长度,则go底层会将容量增加一倍,以满足长度增加 }
本作品采用《CC 协议》,转载必须注明作者和本文链接