在 Go 中,如果通道channel關閉,我仍然可以使用以下語法從中讀取,并且可以測試ok它是否已關閉。value, ok := <- channelif !ok { // channel was closed and drained}但是,如果我不知道某個通道是否已關閉而盲目地對其進行寫入,則可能會出錯。我想知道是否有任何方法可以測試通道并僅在通道未關閉時寫入。我問這個問題是因為有時我不知道一個通道是否在一個 goroutine 中關閉。
2 回答

慕的地10843
TA貢獻1785條經驗 獲得超8個贊
你不能。這里的經驗法則是只有作家才能關閉頻道,這樣你就知道你不應該再寫信給那個頻道了。
一些簡單的代碼如下所示:
for i := 0; i < 100; i++ {
value := calculateSomeValue()
channel <- value
}
close(channel) //indicate that we will no more send values

守著星空守著你
TA貢獻1799條經驗 獲得超8個贊
如果很少有 goroutin 寫入通道,您也可以使用nil它來代替讀寫。像這樣的東西closeselect
ch := make(chan int, 1)
var value int
ch <- 5
select {
case value = <-ch:
fmt.Println("value", value)
default:
fmt.Println("oops")
}
ch = nil
select {
case ch <- 5:
default:
fmt.Println("don't panic")
}
select {
case value = <-ch:
fmt.Println("value", value)
default:
fmt.Println("oops")
}
試試看https://play.golang.org/p/sp8jk961TB
添加回答
舉報
0/150
提交
取消