channel死锁
package main
import "fmt"
func main() {
ch := make(chan string)
for i := 0; i < 10; i++ {
s := <- ch
fmt.Println(s)
}
go func(ch chan string) {
for i := 0; i < 10; i++ {
ch <- fmt.Sprintf("%d", i)
}
}(ch)
}
报错
all goroutines are asleep - deadlock!
分析:无缓冲通道,只有接收端和发送端都准备好才会通过channel传输数据,所以main方法执行到
s := <- ch
这行代码会一直阻塞等待接收端准备好才能往下运行,而阻塞后接受端的代码就会一直运行不到,就会产生死锁。
解决
思路:先开启一个协程让运行接收端/发送端,main主协程继续往下执行。两个协程(接收断/发送端)都准备好后,就开始传输数据。
package main
import "fmt"
func main() {
ch := make(chan string)
go func(ch chan string) {
for i := 0; i < 10; i++ {
ch <- fmt.Sprintf("%d", i)
}
}(ch)
for i := 0; i < 10; i++ {
s := <- ch
fmt.Println(s)
}
}