go语言中chan的死锁问题。

package main

import "fmt"

func main() {
    out := make(chan int)
    out <- 2

    fmt.Println(<-out)
}

上面的代码一运行就有错
fatal error:all goroutines are asleep-deadlock

如果将chan的初始化改为

out:=make(chan int, 1)就可以。

为什么?

因为默认无缓冲的channel是阻塞的,在
out <- 2
这一句会阻塞等待其它goroutine从out读取
然而并没有其他goroutine

无缓冲的channel,如题主的代码。
当在向一个无缓冲的channel发送数据时,代码会阻塞直到有另一个goroutine接收这个channel。
楼上的解释很形象,就像你打电话,你拨过去就等着人接,那边没人接你就一直等,所以阻塞了。
所以改进方法就是,先开启一个goroutine去电话那头等着接电话,然后你再拨号,这样两边就通了,然后故事继续

func haha(ch chan int) {
    num := <-ch
    fmt.Println(num)
}

func main() {
    ch := make(chan int)
    ch <- 2
    //.....
}

我的理解是,chan不同于变量
变量是你可以先放进去,再取出来。
但是chan在是一个通信工具,如果没人取,你就放不进去。
比如电话,没人接你就打不通。但是比如微信你就可以先录进去对方以后再听。

  • 对于单核cpu而言,开多线程的目的难倒只能是为了防止阻塞么?
  • golang的defer问题
  • golang 处理json?
  • golang解析中文字符html出错
  • Go语言中怎样动态向一个函数中注入参数
  • golang 环境build之后可执行文件为什么没有在bin生成?
  • [Go]怎么获得访问者的时区来将对应的时间转换成访问者的时区时间来显示?
  • 关于设置ip 问题
  • 升级 mac os 10.12.4 后 beego 跑不起来了
  • Python多线程使用同一个MySQL连接,如何在所有线程工作完成后关闭游标、连接?
  • Java多线程Thread.currentThread()的疑问