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

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

go select語句中發送和接收操作之間的優先級規則

go select語句中發送和接收操作之間的優先級規則

Go
慕的地8271018 2022-11-15 17:11:31
go select 語句中發送和接收操作之間是否有優先級規則?由于“發送”操作始終準備就緒,不像“接收”操作等待來自通道的某些內容,我總感覺“發送”將首先在選擇上執行。我嘗試了一些代碼來測試發送和接收都準備好時會發生什么:package mainimport (    "fmt"    "time")func main() {    ch1 := make(chan string)    ch2 := make(chan string)    go goOne(ch1)    go goTwo(ch2)    time.Sleep(time.Second * 2)    select {    case ch2 <- "To goTwo goroutine":    case msg1 := <-ch1:        fmt.Println(msg1)    }}func goOne(ch chan string) {    ch <- "From goOne goroutine"}func goTwo(ch chan string) {    msg := <-ch    fmt.Println(msg)}結果似乎總是“來自 goOne goroutine”。所以看起來接收操作具有優先級。但這是設計效果嗎?還是會發生先執行發送的情況?我在文檔中找不到信息如果我希望接收操作具有優先權,我可以依賴它還是應該做其他事情?
查看完整描述

1 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

go select 語句中發送和接收操作之間是否有優先級規則?


不可以。當case同時準備好一個以上時,隨機執行一個。


因為“發送”操作總是準備好的


不對。當另一側沒有接收任何內容或緩沖通道的緩沖區已滿時,發送操作可能只是阻塞(即未準備好)。


還是會發生先執行發送的情況?


Yes, but you may see no output when this case is selected because your program resumes execution in main and exits immediately before the goTwogoroutine can actually print anything.


如果我希望接收操作具有優先級 [...]


select 語句的語義是:“執行先準備好的”。如果一種情況必須優先于另一種情況,請將另一種情況更改為default(如果沒有其他準備就緒則運行):


    select {

    case msg1 := <-ch1:

        fmt.Println(msg1)

    default:

        ch2 <- "To goTwo goroutine"

    }


查看完整回答
反對 回復 2022-11-15
  • 1 回答
  • 0 關注
  • 106 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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