/**
死锁发生的原因是因为主进程在等待out这个通道返回数据,如果这个时候out被关闭的话,程序就会正常结束,但是out这个通道是在worker里面发送数据的,worker也不知道什么时候关闭out,因为worker最后也会因为in里读不到数据而阻塞。从修复问题的层面上来将,这个case应该在main里向in发送数据,发送完毕之后关闭通道in,这样worker就可以在读取完in的数据之后关闭out通道,避免main在读取时发生阻塞,代码如下
**/
package main
import (
"fmt"
"strconv"
"time"
)
func main() {
in := make (chan int)
out := make(chan string, 10)
tasks := []int{1, 2, 3 , 4, 5, 6, 7, 8, 9, 10}
go worker(in, out)
for _, v := range tasks {
in <- v
}
close(in)
receiver(out)
time.Sleep(time.Second * 1)
}
func receiver(out chan string) {
for ret := range out {
fmt.Println(ret)
}
}
func worker(in chan int, out chan string) {
for res := range in{
ret := "返回结果:"
ret += strconv.Itoa(res)
out <- ret
time.Sleep(time.Millisecond * 50)
}
close(out)
}