1 回答
TA贡献1794条经验 获得超8个赞
这是因为append
工作原理。在 Go 中,slice 是一个包含 3 个属性的标头:Len
、Cap
、 和Ptr
。Len
是切片本身的长度,Cap
是切片底层数组(内存)的容量,Ptr
是指向数组的指针。
当append
追加到基础数组中没有更多空间的切片时,它会分配一个比所需空间多的新基础数组,并将原始切片的内容复制到其中,然后添加新元素。
当append
附加到切片时,其中Cap
> Len
,即已分配的内存中仍然有足够的空间,append
保留底层数组并复制要添加到的元素a[Len+1]
(其中 a 是底层数组)。当两个或多个切片共享底层内存时,这将导致问题。
经验法则是经常检查复制切片的需要,以避免不必要的底层数组共享。
要解决该问题,请更改result = append(result, append(v2,v1))
为result = append(result, append([]int{}, append(v2, v1)...))
.
注1:是和append([]int{},append(v2,v1...))
的快捷方式。
注2:在Go中,nil是slice的有效值。cartesianMain
所以你可以通过设置来res
摆脱split in 的分离[]int{nil}
。
注 3:为了获得更好的性能和更少的分配,最好为已知切片设置容量(或长度)。在 中cartesianProduct
,您可以使用result := make([][]int, 0, len(a)*len(b))
.
游乐场:https://play.golang.org/p/rLqDGWoTLKS
- 1 回答
- 0 关注
- 101 浏览
添加回答
举报