小编kok*_*oko的帖子

缓冲和非缓冲通道会出现问题

我对 Go 中缓冲通道和非缓冲通道之间的区别有点困惑。例如,下面的代码执行良好:

package main

import "fmt"

func main() {
    messages := make(chan string)
    go func() { messages <- "ping" }()
    msg := <-messages
    fmt.Println(msg)
}
Run Code Online (Sandbox Code Playgroud)

另一方面,当我"ping"在常规函数中传递消息时,会出现死锁。

package main

import "fmt"

func main() {
    messages := make(chan string)
    func() { messages <- "ping" }()
    msg := <-messages
    fmt.Println(msg)
}
Run Code Online (Sandbox Code Playgroud)

最后,当我使用缓冲通道时,这个问题得到了解决,如下所示

package main

import "fmt"

func main() {
    messages := make(chan string, 1)
    func() { messages <- "ping" }()
    msg := <-messages
    fmt.Println(msg)
}
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么第二个案例失败了。举例说明

默认情况下,通道是无缓冲的,这意味着如果有相应的接收 (<- chan) 准备好接收发送的值,它们只会接受发送 …

go

3
推荐指数
1
解决办法
815
查看次数

标签 统计

go ×1