1 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
你的maingoroutine 在 上發(fā)送一個(gè)值b.c,然后等待:
b.c <- true
從 main 啟動(dòng)的 goroutine:
go b.s()
這是從 接收的b.c,也是從 接收的b.a.c:
func (b *b) s() {
for {
select {
case <-b.c:
fmt.Println("b c")
b.a.do()
case <-b.a.c:
fmt.Println("b a c")
}
}
}
如果從 接收到一個(gè)值b.c,則該 goroutine 會(huì)嘗試發(fā)送b.a.c(在a.do()方法中),并且您希望同一個(gè)goroutine 從 接收b.a.c。但由于b.a.c是無(wú)緩沖的,發(fā)送將被阻塞,因此它永遠(yuǎn)不會(huì)到達(dá)b.s()它可以/將從中接收的下一個(gè)迭代b.a.c。
如果一個(gè)通道是無(wú)緩沖的,那么只有當(dāng)有另一個(gè) goroutine 準(zhǔn)備從它接收數(shù)據(jù)時(shí),才可以在該通道上進(jìn)行發(fā)送。
如果您對(duì)b.a.c通道進(jìn)行緩沖,則可以在不阻塞的情況下繼續(xù)發(fā)送,因此在下一次迭代中可以接收它:
a: a{c: make(chan bool, 1)}
通過(guò)此更改,您將獲得預(yù)期的輸出。在Go Playground上嘗試一下。
- 1 回答
- 0 關(guān)注
- 139 瀏覽
添加回答
舉報(bào)