1 回答

TA貢獻1776條經驗 獲得超12個贊
當你有這個:
ch := make(chan int, 10)
// ...
select {
case ch <- <-out:
fmt.Println("C")
default:
fmt.Println("D")
}
第一個的通信操作case
是ch <- something
,哪里something
是<-out
。但是something
首先評估,然后才檢查案例的哪些通信操作可以進行。
所以<-out
只要它需要就會阻塞,然后ch <- something
檢查它是否可以繼續。由于您使用了足夠大的緩沖區,因此它始終可以在您的示例中繼續進行,因此default
永遠不會選擇。
“select”語句的執行分幾個步驟進行:
對于語句中的所有情況,在輸入“select”語句時,接收操作的通道操作數以及發送語句的通道和右側表達式僅按源順序計算一次。結果是一組要接收或發送到的通道,以及要發送的相應值。無論選擇哪種(如果有的話)通信操作進行,該評估中的任何副作用都會發生。RecvStmt 左側的帶有短變量聲明或賦值的表達式尚未計算。
如果一個或多個通信可以進行,則通過統一的偽隨機選擇選擇一個可以進行的通信。否則,如果存在默認情況,則選擇該情況。如果沒有默認情況,“select”語句會阻塞,直到至少有一個通信可以繼續。
除非所選案例是默認案例,否則執行相應的通信操作。
如果所選案例是帶有短變量聲明或賦值的 RecvStmt,則計算左側表達式并分配接收到的值(或多個值)。
執行所選案例的語句列表。
如果你降低 的緩沖區ch
,你會看到偶爾在輸出中打印 s(在Go PlaygroundD
上試試)。
ch := make(chan int, 2)
- 1 回答
- 0 關注
- 149 瀏覽
添加回答
舉報