亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何測試通道是否關閉并且僅在未關閉時發送給它

如何測試通道是否關閉并且僅在未關閉時發送給它

搖曳的薔薇 2022-03-07 15:53:08
在 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


查看完整回答
反對 回復 2022-03-07
?
守著星空守著你

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


查看完整回答
反對 回復 2022-03-07
  • 2 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號