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

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

在同一選定案例中接收和發送

在同一選定案例中接收和發送

Go
BIG陽 2022-08-30 21:51:53
我需要將一個通道的結果轉發到另一個通道。我用了這樣的東西:for {        select {        ...        case ch2 <- (<-ch1):        ...        }}這似乎很完美,但這里到底發生了什么?select 語句是在接收操作和/或發送操作上選擇的?我知道選擇語句可以單獨選擇:select {    case ch <- v:}select {                                                                             case v = <- ch:}
查看完整描述

2 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

從文檔中

對于語句中的所有情況,在輸入 “select” 語句時,接收操作的通道操作數以及 send 語句的通道和右側表達式將按源順序計算一次。結果是一組要從中接收或發送到的通道,以及要發送的相應值。無論選擇哪個(如果有)通信操作繼續進行,都將發生該評估中的任何副作用。尚未計算 RecvStmt 左側具有短變量聲明或賦值的表達式。

這意味著:

case ch2 <- (<-ch1):

立即阻止從 接收,然后將控制是否發生發送或不同。ch1selectch2case

迪斯科的贊美詩說得很好;將其視為 ,其中在輸入 時進行評估。selectch2 <- <something><something>select

它還具有消耗和丟棄值的副作用,如果該值最終不是所選的值。ch1case


查看完整回答
反對 回復 2022-08-30
?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

正如阿德里安所回答的那樣,這絕對是錯誤的方法。如果您想在某個退出頻道說退出之前接收和轉發數據,則需要以下或類似內容:


func copyInputUntil(output, input chan T, quit chan struct{}) {

    for {

        var v T

        // wait for input value, or quit

        select {

        case <-quit: return // maybe: close(output), too (via earlier defer)

        case v = <-input:

        }

        // wait to send it

        select {

        case <-quit: return

        case output <- v:

        }

    }

}

這可以作為自己的goroutine剝離出來。這不太現實,當然這是低效的:你最好只是讓發送者直接發送到正確的渠道,而不是讓這個愚蠢的goroutine介于兩者之間。


盡管如此,我還是把這一切都變成了圍棋操場上一個完整的例子。


查看完整回答
反對 回復 2022-08-30
  • 2 回答
  • 0 關注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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