gpt4 book ai didi

go - 为什么 golang 中的 select 只适用于 goroutine 中的 channel ?

转载 作者:IT王子 更新时间:2023-10-29 02:26:28 24 4
gpt4 key购买 nike

考虑以下 go playground

    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 := <-messages

最佳答案

Shouldn't the code execute in a sequential manner in the first case so that by the time the select statement is reached, the msg will be passed and it will catch the case msg := <-messages ?

永远不会到达 select 语句,这是您第一个代码中的问题。

声明

messages <- "my msg"

想要将字符串推送到 channel 中,但由于您创建了一个无缓冲 channel

messages := make(chan string)

goroutine 一直在等待有人真正从 channel 读取数据,因此它可以将字符串推送到 channel 。您可以将某些东西推送到无缓冲 channel 如果有某个goroutine正在读取它!

使用缓冲 channel 尝试第一个示例:

messages := make(chan string, 1)

它应该如您所愿地工作。

关于go - 为什么 golang 中的 select 只适用于 goroutine 中的 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39338951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com