Go语言切片实现原理
假设存在数组:arr := []int{0,1,2,3,4,5}
使用切片
arr1 := arr[1:4] // 结果为 {1, 2, 3}
然后
arr2 := arr1[2:4] // 4 超过了arr1长度,并不会报错,结果为 {3, 4}, 会自动补齐
另外
arr3 := arr1[3:5] // 3和5都超过了 arr1的长度,结果为 {4, 5}
实现原理
切片仅为原数组的一个视图(view), 结构:
slice:
ptr:切片指针
len:切片长度
cap: len + 原数组中剩余长度
如arr1: len = 3, cap = len + len([4,5]) = 5
可当在arr1上使用切片时,如 arr1[3:] 不会报错,编译器判断 3 < cap, 会从原数组中获取需要补齐的数