golang 无缓冲channel的死锁问题?

大boss
  • 125
package main

import "fmt"

func main() {
    // 初始化channel
    // channel在使用之前,必须进行make初始化
    // 否则,它会是一个nil
    ch := make(chan int)

    // fmt.Println(ch)

    // 输出channel
    go func() {
        fmt.Println(<-ch)
    }()

    // 输入channel
    ch <- 1

    // 关闭channel
    close(ch)

    fmt.Println(ch)
    // ch <- 2

    <-ch
}

这样运行是ok的。为什么把ch <- 1 挪到 go func() {

    fmt.Println(<-ch)
}()前就报错 死锁尼
回复
阅读 743
1 个回答
✓ 已被采纳

无缓冲通道,在没有取之前会一直会阻塞。写在go func() 前,main方法阻塞,无法执行到go func(),ch永远不会被取数据,所以造成了死锁。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏