Go问答 线程 问题

dbas · 2020年05月29日 · 最后由 naiveboy 回复于 2020年06月11日 · 524 次阅读
func f1(in chan int) {
    fmt.Println(<-in)
}

func main() {
    out := make(chan int)
    go f1(out)
    time.Sleep(2 * time.Second)
    out <- 2
    time.Sleep(2 * time.Second)
}

go f1(out) 后停了 2 秒,下面的 2 还没有发送,为什么 f1 不报错呢 f1 都开始运行了

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio

因为编译器通过语义判断出你这段代码中 chan 有进出。所以就不会出现报错。 f1() 函数内的 <- in 是阻塞状态等待 channel 中的数据

func main() {
    out := make(chan int)

    out <- 2
    go f1(out)
    time.Sleep(2 * time.Second)
}

那为什么,换个位置就不行,@sober-wang

因为你定义的 chan 没有缓冲,所以若想发送成功必须已经有接受者在等待

func main() {
    out := make(chan int)
    out <- 2
    go f1(out)
    time.Sleep(2 * time.Second)
}

这个函数发送之前没有接受者在监听 chan,所以代码会阻塞在 out <- 2,所以会报死锁的错误。你改为 out := make(chan int, 1),就不会报死锁了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册