第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

盡管在這個(gè)通道上選擇了一個(gè) goroutine,為什么寫通道被阻塞了?

盡管在這個(gè)通道上選擇了一個(gè) goroutine,為什么寫通道被阻塞了?

Go
白衣染霜花 2023-06-19 15:49:52
我對以下代碼感到困惑,我在代碼中寫下了一些注釋,指出了我的困惑。并且在代碼的最后有一個(gè)執(zhí)行結(jié)果,我也寫下了我期望的結(jié)果。package mainimport (    "fmt"    "time")func sendRPC() bool {    time.Sleep(5 * time.Second)    return true}func main() {    done := make(chan struct{})    ch := make(chan bool)    go func() { // goroutine A        select {        case ch <- sendRPC():            fmt.Println("RPC return")        case <-done:            fmt.Println("exit")        }    }()    select {    case <-ch:    case <-time.After(1000 * time.Millisecond):        fmt.Println("timeout")        if len(done) == 0 {            fmt.Println("1")            // here write done channel will block until sendRPC() return, why?            // I expect that the write is nonblock because goroutine A is select on done channel.            done <- struct{}{}            fmt.Println("2")        }    }    // result:    // timeout (after about 1 second)    // 1    // exit    (after about 5 seconds, I expect that it is printed after about 1 second too.)    // 2}
查看完整描述

1 回答

?
繁星coding

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊

規(guī)范說:

對于語句中的所有情況,接收操作的通道操作數(shù)以及發(fā)送語句的通道和右側(cè)表達(dá)式在輸入“select”語句時(shí)按源順序恰好計(jì)算一次。結(jié)果是一組要從中接收或發(fā)送到的通道,以及要發(fā)送的相應(yīng)值。無論選擇哪個(gè)(如果有的話)通信操作繼續(xù)進(jìn)行,該評估中的任何副作用都會發(fā)生。

goroutine A 中選擇的通道集等待對 的求值sendRPC()。查看這個(gè)等效的 goroutine 可能會有所幫助:

go func() { // goroutine A

? ? v := sendRPC()? // waits for 5 seconds

? ? select {

? ? case ch <- v:

? ? ? ? fmt.Println("RPC return")

? ? case <-done:

? ? ? ? fmt.Println("exit")

? ? }

}()

接收done延遲 5 秒。


查看完整回答
反對 回復(fù) 2023-06-19
  • 1 回答
  • 0 關(guān)注
  • 127 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號