Go语言学习笔记-并发编程-channel的关闭和广播
2019-04-24 本文已影响0人
noonenote
- 向关闭的channel发送数据,会导致panic
- v,ok <-ch;ok为bool值,true表示正常接受,false表示通道关闭
- 所有的channel接收者都会在channel关闭时,立刻从阻塞等待中返回并返回且上述ok值为false。这个广播机制常被利用,进行向多个接收者同时发送信号。如退出信号
package channel_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)
wg.Done()
}()
}
func dataReceiver(ch chan int, wg *sync.WaitGroup) {
go func() {
for {
if data, ok := <-ch; ok {
fmt.Println(data)
} else {
break
}
}
wg.Done()
}()
}
func TestCloseChannel(t *testing.T) {
var wg sync.WaitGroup
ch := make(chan int)
wg.Add(1)
dataProducer(ch, &wg)
wg.Add(1)
dataReceiver(ch, &wg)
// wg.Add(1)
// dataReceiver(ch, &wg)
wg.Wait()
}