2 回答

TA貢獻1735條經(jīng)驗 獲得超5個贊
你遇到死鎖的原因是break你select唯一的內(nèi)部打破了select,讓for循環(huán)自由地重新進入選擇,沒有一個通道準(zhǔn)備好從中讀取。
您可以通過執(zhí)行以下操作來挽救它:
done := false
for !done {
select {
...
case <-chClose:
done = true
fmt.Println("CLOSED")
}
}
這很for容易讓循環(huán)終止。
另一種是使用標(biāo)簽:
OuterLoop:
for {
select {
...
case <-chClose:
fmt.Println("CLOSED")
break OuterLoop
}
}
在這種情況下,我個人對第一個版本有一點偏好,但這只是個人喜好問題。

TA貢獻1798條經(jīng)驗 獲得超3個贊
你break
在你的程序結(jié)束時只打破select
(并再次進入循環(huán),因此陷入僵局):用return
工作正常替換它:https : //play.golang.org/p/j5bDaj3z7y
事實上,從規(guī)格:
“break”語句會終止同一個函數(shù)中最里面的“for”、“switch”或“select”語句的執(zhí)行。
您可以通過return
(如我所做的)、goto 或其他一些架構(gòu)重構(gòu)來解決這個問題。
至于無限循環(huán),也是同樣的問題,而不是封閉通道總是返回,所以當(dāng)break
退出 時select
,你進入循環(huán),并nil
永遠(yuǎn)從封閉通道接收s
- 2 回答
- 0 關(guān)注
- 214 瀏覽
添加回答
舉報