golang:channel消息传递练习
用channel实现一个消息传递,需求如下:
//启动一个goroutine,生成100个数发送到ch1//启动一个goroutine,从ch1取值,计算它的平方放到ch2中//再main中,从ch2打印出来直接贴最后代码。
var wg sync.WaitGroup func main(){ wg.Add(2) ch1 := make(chan int, 100) ch2 := make(chan int, 100) go func(){ defer wg.Done() for i:=0; i<100; i++{ ch1 <- i } close(ch1) }() go func(){ defer wg.Done() for x := range ch1{ ch2 <- x * x } close(ch2) }() wg.Wait() for i:= range ch2{ fmt.Println(i) } }
注意:接受消息时,当需要告知另一个goroutine数据已经发送完毕时,需要关闭该channel.go圣经
其实你并不需要关闭每一个channel。只有当需要告诉接收者goroutine,所有的数据已经全部发送时才需要关闭channel。不管一个channel是否被关闭,当它没有被引用时将会被Go语言的垃圾自动回收器回收。(不要将关闭一个打开文件的操作和关闭一个channel操作混淆。对于每个打开的文件,都需要在不使用的使用调用对应的Close方法来关闭文件。)
这里接受从channel消息的有两种方法,第一种
i, ok := <-ch1 // 通道关闭后再取值ok=false if !ok { break }
当channel close的时候,并且channel的数据已经被全部接受为空时。下一次接受仍然不报错,只不过只是ok值为false,说明接受消息已经结束,可以继续执行下面的步骤。
第二种方法,就是代码中的range方法,如果channel close时,并且消息全部接收完毕,channel为空时,range就会自动退出。
相关推荐
GoatSucker 2020-11-23
CoderToy 2020-11-16
蛰脚踝的天蝎 2020-11-10
ZGCdemo 2020-11-09
86193952 2020-10-27
Lzs 2020-10-23
hjr 2020-10-21
HELLOBOY 2020-10-21
qidiantianxia 2020-10-21
cmsmdn 2020-10-21
myspace 2020-10-21
笑面依旧 2020-10-21
专注前端开发 2020-10-21
技术之博大精深 2020-10-16
zhushenghan 2020-11-09
风雨断肠人 2020-10-13
xuguiyi00 2020-11-04
sichenglain 2020-10-27