亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Go 中向無緩沖通道寫入/讀取多個值?

如何在 Go 中向無緩沖通道寫入/讀取多個值?

Go
慕桂英546537 2022-10-04 17:22:43
這似乎挑戰了我對無緩沖通道的理解,即它只能取一個值,然后它會阻止讀者閱讀它。下面的代碼如何能夠寫入 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個贊

粘貼的摘錄的每一行都由您的示例代碼證明,如果您了解發生的事件的順序。

  1. 在 goroutines 啟動后,您的主要例程被阻止從通道讀取 ,因為它尚未看到要讀取的值。例程等待一秒鐘,然后再將第一個值寫入通道cwriteToChan

  2. 戈魯廷也被阻塞,因為它正在等待在頻道上讀取rdFrmChanch

  3. 1 之后,當休眠到期時,第一個寫入 () 將首先取消阻止您的主例程,導致值存儲在即 42 中writeToChanc <- 42x

  4. 接下來,在下一次寫入通道 () 時取消阻止 ,并看到值 27。例程在打印值后終止于此時rdFrmChanc <- 27

  5. 在這一點上,只有價值要寫,一個有價值要讀。來自戈魯丁的第三個寫入()允許主要例程讀取值作為其中的一部分并打印它c <- 9<-ch


查看完整回答
反對 回復 2022-10-04
  • 1 回答
  • 0 關注
  • 60 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號