Go1.2最大的语言变化是切片操作时,可以设置新切片的容量。这个需求在Go1之前就被提出了,但是因为Go1修改工作较大而延期到了Go1.2才被实现。
比如下面的代码:
var a = make([]int, 10)
var i, j, k = 3, 6, 8
var b = [i:j:k] // i<=j<=k
fmt.Println(len(b), cap(b)) // 3 5
其中b切片是从a切片的第i个元素开始到第j个元素前结束,b切片的容量为从第i个元素开始到第k个元素前的元素个数(k不能超出a切片的容量)。
为了配合切片语法的变更,reflect包也增加了相应的方法:
func (v Value) SetCap(cap int)
func (v Value) Slice3(low, high, max int) Value
其中Value.SetCap只调整切片的容量,和a[::cap]写法效果等价。而Value.Slice3在进行切片操作的同时也指定新切片的容量,和a[low:high:max]写法效果等价。
通过限制子切片的容量,可以将不同子切片进行安全的分割,避免子切片无意越界操作其它切片空间。