1 回答

TA貢獻(xiàn)1794條經(jīng)驗 獲得超8個贊
這是因為append
工作原理。在 Go 中,slice 是一個包含 3 個屬性的標(biāo)頭:Len
、Cap
、 和Ptr
。Len
是切片本身的長度,Cap
是切片底層數(shù)組(內(nèi)存)的容量,Ptr
是指向數(shù)組的指針。
當(dāng)append
追加到基礎(chǔ)數(shù)組中沒有更多空間的切片時,它會分配一個比所需空間多的新基礎(chǔ)數(shù)組,并將原始切片的內(nèi)容復(fù)制到其中,然后添加新元素。
當(dāng)append
附加到切片時,其中Cap
>?Len
,即已分配的內(nèi)存中仍然有足夠的空間,append
保留底層數(shù)組并復(fù)制要添加到的元素a[Len+1]
(其中 a 是底層數(shù)組)。當(dāng)兩個或多個切片共享底層內(nèi)存時,這將導(dǎo)致問題。
經(jīng)驗法則是經(jīng)常檢查復(fù)制切片的需要,以避免不必要的底層數(shù)組共享。
要解決該問題,請更改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
所以你可以通過設(shè)置來res
擺脫split in 的分離[]int{nil}
。
注 3:為了獲得更好的性能和更少的分配,最好為已知切片設(shè)置容量(或長度)。在 中cartesianProduct
,您可以使用result := make([][]int, 0, len(a)*len(b))
.
游樂場:https://play.golang.org/p/rLqDGWoTLKS
- 1 回答
- 0 關(guān)注
- 143 瀏覽
添加回答
舉報