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 關注
- 160 瀏覽
添加回答
舉報
