对于go语言的初学者,在学习chan模块的时候,可能大家都会遇到一个很简单的问题就是提示如下错误:
fatal error: all goroutines are asleep - deadlock!
//错误代码如下:
package main
func main() {
// 创建一个整型通道
ch := make(chan int)
// 尝试将1通过通道发送
ch <- 1
go func() {
println("ch val:", <-ch)
}()
time.Sleep(time.Second)
}
//如上错误的原因就是:main函数有个默认的goroutine,ch<-1之后被阻塞,此时也只有一个goroutine,第二个go func的goroutine还没有启动,所以提示所有的goroutines
被阻塞,正确的方法是,在main函数的gotoutine被阻塞之前创建第二个gotoutine,正确的代码如下:
package main
func main() {
// 创建一个整型通道
ch := make(chan int)
go func() {
println("ch val:", <-ch)
}()
// 尝试将1通过通道发送
ch <- 1
//防止println之前,main的gotinue,早于第二个gotinue的println,导致程序没有输出
time.Sleep(time.Second)
}