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

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

我對發送者通道的效果有疑問

我對發送者通道的效果有疑問

Go
守候你守候我 2023-07-10 17:56:10
我不清楚為什么如果我刪除in ,則 in 中的 print 語句func a1將不會打印任何內容。我認為在我們將某些內容發送到結果之前,應該執行打印語句,并且不應對此產生任何影響。<-resultfunc a2<-resultfunc a2(){    x := 3    result := make(chan int, 10)    input := make(chan int, 10)    go a1(x, input, result)    input <- 4    <-result}func a1(x int, input <-chan int, result chan<- int){    y := <-input    fmt.Println("hello", y)    result <- x}但是,然后我嘗試了以下代碼:hello無論我<-result是否有,它都會打印。func a2(){    x := 3    result := make(chan int, 10)    go a1(x, result)    <-result}func a1(x int, result chan<- int){    fmt.Println("hello")    result <- x}能否詳細解釋一下,以便初學者能夠理解?看起來input <-chan int這個輸入通道正在做一些導致差異的事情。
查看完整描述

1 回答

?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

因為如果沒有 <-result,a2() 返回并且程序終止,假設 a2() 是 main() 唯一做的事情??赡?a1() 甚至永遠不會醒來,因為輸入通道已緩沖,并且寫入不會阻塞。如果將其設置為無緩沖,則 a1() 將在 a2() 返回之前喚醒,但這仍然不能保證 println 能夠運行。

使用 <-result,a2() 等待 a1() 從結果通道讀取,該通道位于 println 之后。這是確保 println 運行的唯一最安全的方法。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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