第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

goroutine 只通過通道傳遞一半的值

goroutine 只通過通道傳遞一半的值

Go
哈士奇WWW 2021-11-15 15:36:07
我有一個(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ù)沖突。


查看完整回答
反對(duì) 回復(fù) 2021-11-15
  • 1 回答
  • 0 關(guān)注
  • 207 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)