我有一個文件:package mainimport "fmt"funccombinations(result chan []byte, len int, min byte, max byte) { res := make([]byte,len) for i := 0; i < len; i++ { res[i] = min } result <- res for true { i := 0 for i = 0; i < len; i++ { if res[i] < max { res[i] = res[i] + 1; break } else { res[i] = 32 } } result <- res if(i == len) { close(result) return; } }}funcmain() { combination_chan := make(chan []byte) go combinations(combination_chan, 2, 0, 5) for next_combination := range combination_chan { fmt.Printf("%x\n",next_combination) }}我希望這會打印 0 到 5 之間 2 個字節的所有可能組合,即:00000100...0001...0505但是,它似乎跳過所有其他值,并打印兩次相同的值,IE:0100010003000300...為什么會這樣做?我在“result <- res”行之前插入了打印件,這些都是正確的。
1 回答

拉風的咖菲貓
TA貢獻1995條經驗 獲得超2個贊
如果我們稍微簡化一下,Go 中的切片基本上是一個指向數組的指針,因此通過傳遞一個您仍然擁有和修改的切片通過通道,您會創建數據競爭。
不知道切片的內容在傳遞到通道的那一刻和另一個 goroutine 從通道讀取的那一刻之間是否被修改。
所以你的整個算法會導致未定義的行為,因為你只是在修改它們時一遍又一遍地傳遞相同的內容。
您的情況的解決方案是在通過通道發送之前復制切片:
buf := make([]byte, len(res))
copy(buf, res)
result <- buf
看到它在這里運行:http : //play.golang.org/p/ulLYy9Uqnp
另外,我不建議使用len作為變量名,因為它可能與len()內置函數沖突。
- 1 回答
- 0 關注
- 219 瀏覽
添加回答
舉報
0/150
提交
取消