incoming := make(chan int)
done := make(chan struct{})
...
close(done)
...
select {
case incoming <- order:
// logic
case <-done:
return
}
假設您在 select 陳述句之前關閉了 done 通道:
1.case <-done 將被選中。
2.這是因為當close(done)執行時,done通道將處于一種狀態,在這種狀態下,select陳述句將認為“case <-done”匹配寫入case“incoming <-order”?
uj5u.com熱心網友回復:
該select陳述句阻塞,直到其中的一個或多個通信操作cases可以繼續。一旦一個或多個通信操作可以進行,將隨機選擇其中一個。select
關閉后的接收操作channel可以立即進行。
選擇陳述句:
“select”陳述句的執行分幾個步驟進行:
- 對于陳述句中的所有情況,在輸入“select”陳述句時,接收操作的通道運算元以及發送陳述句的通道和右側運算式僅按源順序計算一次。結果是一組要接收或發送到的通道,以及要發送的相應值。無論選擇哪種(如果有的話)通信操作進行,該評估中的任何副作用都會發生。RecvStmt 左側帶有 > 短變數宣告或賦值的運算式尚未計算。
- 如果一個或多個通信可以進行,則通過統一的偽隨機選擇選擇一個可以進行的通信。 否則,如果存在默認情況,則選擇該情況。如果沒有默認情況,“select”陳述句會阻塞,直到至少有一個通信可以繼續。
- 除非所選案例是默認案例,否則執行相應的通信操作。
- 如果所選用例是帶有短變數宣告或賦值的 RecvStmt,則計算左側運算式并分配接收到的值(或多個值)。
- 執行所選案例的陳述句串列。
接收運營商:
關閉通道上的接收操作總是可以立即進行,在接收到任何先前發送的值之后產生元素型別的零值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/450150.html
上一篇:`sync.Mutex`、`sync.Map`和`atomic.Value`中的效率比較
下一篇:使用GoColly獲取屬性值
