2 回答

TA貢獻2051條經驗 獲得超10個贊
從文檔中:
對于語句中的所有情況,在輸入 “select” 語句時,接收操作的通道操作數以及 send 語句的通道和右側表達式將按源順序計算一次。結果是一組要從中接收或發送到的通道,以及要發送的相應值。無論選擇哪個(如果有)通信操作繼續進行,都將發生該評估中的任何副作用。尚未計算 RecvStmt 左側具有短變量聲明或賦值的表達式。
這意味著:
case ch2 <- (<-ch1):
將立即阻止從 接收,然后將控制是否發生發送或不同。ch1
select
ch2
case
迪斯科的贊美詩說得很好;將其視為 ,其中在輸入 時進行評估。select
ch2 <- <something>
<something>
select
它還具有消耗和丟棄值的副作用,如果該值最終不是所選的值。ch1
case

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介于兩者之間。
盡管如此,我還是把這一切都變成了圍棋操場上一個完整的例子。
- 2 回答
- 0 關注
- 119 瀏覽
添加回答
舉報