golang管道channel顺序执行报错deadlock

当golang顺序执行时,会报错
fatal error: all goroutines are asleep - deadlock!

package main
import (
    "fmt"
)
func main() {
    ch := make(chan int)
    ch<-1
    c1 :=<-ch
    fmt.Println(c1)
}

不知道有没有跟我一样好奇,为什么下面读取了管道的内容,还是会报错呢,其实这样是因为对主程main而言,到ch<-1时,无法知道下面是否管道有读取数据,所以就会阻塞报错,可以在ch<-1上面加个go协程来处理,这也是为什么go协程写到ch<-1下面会报错的原因(当然用非阻塞也可以解决)
这么解释获取更专业一点:
通道ch在写入时,是同步等待接收端接收的状态,而接收的代码却在下一行,这个时候就导致了整个程序无法往下执行,造成死锁
解决方案:
起一个协程,使接受数据和发送数据并行执行
正确写法:

package main
import (
    "fmt"
)
func main() {
    ch := make(chan int)
    go t1(ch)
    ch<-1
}
func t1(ch chan int){
    fmt.Println("协程开始")
    c1 :=<-ch
    fmt.Println(c1)
}

注意下面这个go t1()位置,是错误的,原因就是main无法判断下面是否有管道ch数据读取

package main
import (
    "fmt"
)
func main() {
    ch := make(chan int)
    ch<-1
    go t1(ch) //ERROR:不可写在ch<-1后面
}
func t1(ch chan int){
    fmt.Println("协程开始")
    c1 :=<-ch
    fmt.Println(c1)
}

当然也可以给管道ch增加缓存区后,这样数据暂存到缓冲区,就不需要接收端同时接收数据了

你可能感兴趣的:(golang,go,golang,开发语言,后端)