👇下面代码会输出什么?
slices := make([]int, 1)
slices = append(slices, 1)
fmt.Printf("slices length: %d, cap: %d, arrs :%v\n", len(slices), cap(slices), slices)
输出的是
slice length: 2, cap: 2, arrs :[0 1]
而不是
slice length: 1, cap: 1, arrs :[1]
为什么?我有时候会进行切片copy逻辑,代码如下:
slices1 := make([]int, 0)
slices1 = append(slices, 1)
slices2 := make([]int, len(slices1))
for _, s := range slices1 {
slices2 = append(slices2, s)
}
fmt.Printf("slices1 length: %d, cap: %d, arrs :%v\n", len(slices1), cap(slices1), slices1)
fmt.Printf("slices2 length: %d, cap: %d, arrs :%v\n", len(slices2), cap(slices2), slices2)
创建一个新的切片slices2保存slices1的内容,我想为了避免slice1的动态扩容,默认给slices2一个长度。最后结果却不如人意:
slices1 length: 1, cap: 1, arrs :[1]
slices2 length: 2, cap: 2, arrs :[0 1]
拷贝的切片slices2内容多了一个初始化的元素0, 在创建切片时使用的make([]int, len)
, 而不是make([]int, len, cap)
, 这样就告诉切片长度从len的位置开始,后面在添加元素时,就时在len之后累加,所以导致了上述问题,可以参考下图:
那上面的初始化切片代码这么改就行了。
... 省略
slices2 := make([]int, 0, len(slices1))
... 省略
参考文章:
How to use slice capacity and length in Go
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)