簡體   English   中英

為什么golang中的select僅適用於goroutine中的通道?

[英]Why does select in golang only works with channels in goroutine?

考慮下面的游樂場

    package main

    import "fmt"

    func main() {
        messages := make(chan string)

        messages <- "my msg"

        select {
        case msg := <-messages:
            fmt.Println("received message", msg)
        }

    }

上面的代碼將到達錯誤

fatal error: all goroutines are asleep - deadlock!

然而

如果我將其更改為

    package main

    import "fmt"

    func main() {
        messages := make(chan string)

        go func() {
            messages <- "my msg"
        }()
        select {
        case msg := <-messages:
            fmt.Println("received message", msg)
        }

    }

它會工作。

這種行為是否有特定原因?

在第一種情況下,代碼不應該以順序方式執行,以便在到達select語句時,將傳遞msg並捕獲msg := <-messages嗎?

在第一種情況下,代碼不應該以順序方式執行,以便在到達select語句時,將傳遞msg並捕獲msg:= <-messages嗎?

永遠不會到達select語句,這就是您的第一個代碼中的問題。

該聲明

messages <- "my msg"

想要將字符串推入通道,但由於您創建了無緩沖通道

messages := make(chan string)

goroutine一直在等待某人實際從該通道讀取,因此可以將字符串推送到該通道。 如果有goroutine讀取內容,則只能將內容推送到無緩沖通道!

使用緩沖通道嘗試第一個示例:

messages := make(chan string, 1)

它應該按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM