我有一個(gè)文件: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) }}我希望這會(huì)打印 0 到 5 之間 2 個(gè)字節(jié)的所有可能組合,即:00000100...0001...0505但是,它似乎跳過所有其他值,并打印兩次相同的值,IE:0100010003000300...為什么會(huì)這樣做?我在“result <- res”行之前插入了打印件,這些都是正確的。
1 回答

拉風(fēng)的咖菲貓
TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
如果我們稍微簡化一下,Go 中的切片基本上是一個(gè)指向數(shù)組的指針,因此通過傳遞一個(gè)您仍然擁有和修改的切片通過通道,您會(huì)創(chuàng)建數(shù)據(jù)競爭。
不知道切片的內(nèi)容在傳遞到通道的那一刻和另一個(gè) goroutine 從通道讀取的那一刻之間是否被修改。
所以你的整個(gè)算法會(huì)導(dǎo)致未定義的行為,因?yàn)槟阒皇窃谛薷乃鼈儠r(shí)一遍又一遍地傳遞相同的內(nèi)容。
您的情況的解決方案是在通過通道發(fā)送之前復(fù)制切片:
buf := make([]byte, len(res))
copy(buf, res)
result <- buf
看到它在這里運(yùn)行:http : //play.golang.org/p/ulLYy9Uqnp
另外,我不建議使用len作為變量名,因?yàn)樗赡芘clen()內(nèi)置函數(shù)沖突。
- 1 回答
- 0 關(guān)注
- 207 瀏覽
添加回答
舉報(bào)
0/150
提交
取消