2 回答

TA貢獻1817條經(jīng)驗 獲得超6個贊
這與select
語句在 Go 中的工作方式有關(guān)。
如果可以進行一個或多個通信,則通過統(tǒng)一偽隨機選擇選擇可以進行的單個通信。否則,如果存在默認情況,則選擇該情況。如果沒有默認情況,“select”語句會阻塞,直到至少有一個通信可以繼續(xù)。
因此,如果沒有默認情況,代碼將一直阻塞,直到任一通道中的某些數(shù)據(jù)可用。它隱式地等待其他 goroutines 喚醒并寫入它們的通道。
當您添加 default case 時,很可能select
在其他 goroutines 從睡眠中醒來之前到達該語句。
因此,由于(尚)沒有可用數(shù)據(jù),并且存在默認情況,因此會執(zhí)行默認情況。此操作進行兩次,耗時不到 1 秒。所以程序在任何 go 例程有機會喚醒并寫入通道之前終止。
請注意,這在技術(shù)上是一種競爭條件;絕對不能保證循環(huán)的 2 次迭代會在任何 go 例程喚醒之前運行,因此理論上即使在默認情況下也可能有不同的輸出,但實際上這是極不可能的。

TA貢獻1820條經(jīng)驗 獲得超10個贊
該select
語句會阻塞,直到至少一個 case 準備就緒。Go 語言規(guī)范部分內(nèi)容如下:
如果可以進行一個或多個通信,則通過統(tǒng)一偽隨機選擇選擇可以進行的單個通信。否則,如果存在默認情況,則選擇該情況。如果沒有默認情況,“select”語句會阻塞,直到至少有一個通信可以繼續(xù)。
在原始代碼中,default
案例在循環(huán)的兩次迭代中都已準備就緒,因為在c1
或上發(fā)送任何內(nèi)容之前存在延遲c2
。
刪除default
案例后,select
語句必須等待數(shù)據(jù)在c1
或 中可用c2
。
- 2 回答
- 0 關(guān)注
- 318 瀏覽
添加回答
舉報