2 回答
TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊
outchannel 是無緩沖的,所以如果你在沒有另一個(gè) goroutine 等待讀取它的情況下寫入它,它將阻塞。讀取也一樣:它將阻塞,直到另一個(gè) goroutine 寫入它。因此,goroutine 在寫入時(shí)阻塞,直到 main 中的 for 循環(huán)從中讀取。主 goroutine 會(huì)從 out 讀取直到它關(guān)閉,所以當(dāng) goroutine 最終關(guān)閉時(shí),for 循環(huán)終止。
TA貢獻(xiàn)1858條經(jīng)驗(yàn) 獲得超8個(gè)贊
按照它的工作原理:
in := make(chan int, 10) out := make(chan int)
上面你正在創(chuàng)建兩個(gè)通道。in被緩沖可以容納 10 個(gè)值。out無緩沖只能保存 1 個(gè)值
對(duì)于我:= 0;我 < 10; i++ { 在 <- i }
在上面,您正在向您的輸入頻道添加 10 個(gè)值 [0-9]
逼近)
上面你正在關(guān)閉in頻道上的寫入。請(qǐng)記住,繼續(xù)閱讀in仍然是開放的。
去函數(shù)(){
您正在創(chuàng)建一個(gè) go 例程來讀取in通道的值。(最佳實(shí)踐實(shí)際上是將 func 傳遞in給 func ,但這不是這里的重點(diǎn)。
for {
i, ok := <-in在您的循環(huán)上方,您讀取值直到in為空(為空ok時(shí)為假)
if !ok {
close(out)
break
}當(dāng)您out完成從in. 直到下面的行執(zhí)行。
out <- i * 2 //THIS LINE
在上面你寫入通道out并阻塞這個(gè) goroutine 直到它的值被讀取。循環(huán)將持續(xù) 10 次。
for v := range out { // AND HERE fmt.Println(v) }
上面,回到主 goroutine,您將從 讀取值out,阻塞并將控制權(quán)傳遞給另一個(gè) goroutine。這一直持續(xù)到 for 循環(huán)中斷并out關(guān)閉。
- 2 回答
- 0 關(guān)注
- 126 瀏覽
添加回答
舉報(bào)
