我有這段代碼可以生成長度為 n 的所有二進制序列。所以:allBitsSeqs(2) gives a 1-by-n int slice [[1 1][0 0] [1 0] [0 1]]這是代碼:func allBitSeqs(n int) [][]int { seq := [][]int{{1}, {0}} for floor := 1; floor < n; floor++ { remember := [][]int{} for i := 0; i < len(seq); i++ { one := append(seq[i], 1) remember = append(remember, one) zero := append(seq[i], 0) remember = append(remember, zero) } seq = remember } return seq}游樂場鏈接:https://play.golang.org/p/s40RS7qEKfL問題是,當 n = 4 或更多時,我得到:[[1 1 1 0] [1 1 1 0] [1 1 0 0] [1 1 0 0] [1 0 1 0] [1 0 1 0] [1 0 0 0] [1 0 0 0] [0 1 1 0] [0 1 1 0] [0 1 0 0] [0 1 0 0] [0 0 1 0] [0 0 1 0] [0 0 0 0] [0 0 0 0]]注意它們是如何成對重復的。我嘗試過一些調試,我認為這與 Go 在需要分配更多空間時如何復制其切片有關。
1 回答

縹緲止盈
TA貢獻2041條經驗 獲得超4個贊
切片是底層數組的視圖。如果您有多個切片使用同一個底層數組,并且您不知道切片如何工作,則可能會得到意外的結果。
one := append(seq[i], 1)
比如說,one
是一個指向數組的切片,該數組有能力保存添加的元素。像下面這樣:
[ 1 1 . . . ]
數組容量為 5,前兩個元素設置為 1(切片長度=2)。再加上1,就變成:
[ 1 1 1 . .]
然后您執行以下操作:
remember = append(remember, one)
這樣,您添加了一個指向上面數組的切片,其中 len=3 且容量=5。
然后:
zero := append(seq[i], 0)
請記住 seq[i] 仍然指向同一個數組。另外,seq[i]的len=2。所以數組就變成了:
[ 1 1 0 . . ]
那是你的zero
。但是,當您添加 0 時,您也更改了 slice one
。你最終會得到 和zero
并one
指向[1 1 0 . .]
。
長話短說:當您將切片分配給變量時,您將視圖分配給數組。如果修改底層數組的內容,視圖的內容也會更改。
修復方法:創建一個新切片、復制數據并存儲該副本。
- 1 回答
- 0 關注
- 108 瀏覽
添加回答
舉報
0/150
提交
取消