這似乎挑戰了我對無緩沖通道的理解,即它只能取一個值,然后它會阻止讀者閱讀它。下面的代碼如何能夠寫入 3 個值?writeToChan更令人驚訝的是,盡管順序不同,但這些值如何可供以后讀取?https://golang.org/doc/effective_go#channels 節選接收方總是阻塞,直到有數據要接收。如果通道未緩沖,則發送方將阻塞,直到接收方收到該值。如果通道有緩沖區,則發送方僅在將值復制到緩沖區之前才會阻塞;如果緩沖區已滿,則意味著要等到某個接收方檢索到值。package mainimport ( "fmt" "time")func main() { ch := make(chan int) go writeToChan(ch) go rdFrmChan(ch) x := <- ch fmt.Println("main read 1 -:",x) fmt.Println("main read 2 -:",<-ch)}func writeToChan(c chan int) { time.Sleep(time.Second * 1) c <- 42 c <- 27 c <- 9}func rdFrmChan(c chan int) { fmt.Println("Go routine read :", <-c)}輸出:去常規閱讀:27主要閱讀1 -: 42主要閱讀2 -:9Playground link: https://play.golang.org/p/DYzfYh-kXnC
1 回答

白板的微信
TA貢獻1883條經驗 獲得超3個贊
粘貼的摘錄的每一行都由您的示例代碼證明,如果您了解發生的事件的順序。
在 goroutines 啟動后,您的主要例程被阻止從通道讀取 ,因為它尚未看到要讀取的值。例程等待一秒鐘,然后再將第一個值寫入通道
c
writeToChan
戈魯廷也被阻塞,因為它正在等待在頻道上讀取
rdFrmChan
ch
1 之后,當休眠到期時,第一個寫入 () 將首先取消阻止您的主例程,導致值存儲在即 42 中
writeToChan
c <- 42
x
接下來,在下一次寫入通道 () 時取消阻止 ,并看到值 27。例程在打印值后終止于此時
rdFrmChan
c <- 27
在這一點上,只有價值要寫,一個有價值要讀。來自戈魯丁的第三個寫入()允許主要例程讀取值作為其中的一部分并打印它
c <- 9
<-ch
- 1 回答
- 0 關注
- 60 瀏覽
添加回答
舉報
0/150
提交
取消