channler的关闭和广播


一:channler通道的关闭
1.向关闭的channler发送数据,会导致panic
2.v,ok<-ch;ok为bool值,true标示正常接受,false标示通道关闭
3.所有的channler接收者在通道关闭时,立刻从阻塞的等待中返回且上述OK值为false.
广播机制常被利用,进行向多个订阅者同时发送信号。如:退出信号。
package channler_close

import (
"fmt"
"sync"
"testing"
)

func dataProducer(ch chan int, wg *sync.WaitGroup) {
go func() {
for i := 0; i < 10; i++ {
ch <- i
}
close(ch) //关闭channler
wg.Done() //协程安全,告知Wait执行完
}()
}
func dateReceiver(ch chan int, wg *sync.WaitGroup) {
go func() { //协程(两种写法)
/*for i := 0; i < 10; i++ {
data := <-ch //从channler读取数据打印
fmt.Println(data)
}*/
for {
//判断通道是否已关闭,关闭直接break
if data, ok := <-ch; ok {
fmt.Println(data)
} else {
break
}
}
wg.Done() //协程安全,告知wait该等候已执行完
}()
}

func TestCloseChannler(t *testing.T) {
var wg sync.WaitGroup //协程安全
ch := make(chan int)
wg.Add(1) //添加等候+1
dataProducer(ch, &wg) //添加插入channler通道
wg.Add(1)
dateReceiver(ch, &wg) //读取channler通道值
}

 

posted @ 2019-07-08 19:21  易云客  阅读(291)  评论(0编辑  收藏  举报