[英]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.