gpt4 book ai didi

go - 从缓冲 channel 和非缓冲 channel 中选择

转载 作者:行者123 更新时间:2023-12-05 02:40:09 27 4
gpt4 key购买 nike

当我运行以下简单代码时,它会按预期打印“ping”:

    messages := make(chan string)

go func() { messages <- "ping" }()
fmt.Println(<-messages)

但是,当我将同一个非缓冲 channel 与 select 一起使用时,它不会通过 ping 来实现它,因此会打印“未发送消息”:

    messages := make(chan string)

select {
case messages <- "ping":
fmt.Println("sent message")
default:
fmt.Println("no message sent")
}

为什么会这样? channel 是相同的,但它可以通过 goroutine 访问,但不能通过 select 访问。

此外,我发现当我将它转换为缓冲 channel (大小为 1)时,它会像魅力一样满足 channel :为什么?

    messages := make(chan string,1)

select {
case messages <- "ping":
fmt.Println("sent message")
default:
fmt.Println("no message sent")
}

请注意,没有任何挂断,但正如我所描述的那样立即返回。

最佳答案

select语句 block 直到 case 中的任何一个s 准备就绪,或者它运行 default如果没有准备好的话。

在你的第二个程序中,select 之前没有出现接收操作, 所以 case messages <- "ping"还没有准备好——没有接收器——和default总是被执行。

使用缓冲 channel ,即使另一端没有接收者,发送操作也不会阻塞,所以 case messages <- "ping"准备就绪并运行。

在带有 goroutine 的片段中,发送操作并发运行,因此主程序流可以转到 fmt.Println。调用并阻止 <-messages , 直到并发发送使 channel 上的值可用

关于go - 从缓冲 channel 和非缓冲 channel 中选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68725744/

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