/**
* 结论:
* chan 在 goroutine间通信时,一定read/write 次数要匹配
* 不然会deadlock
* 终止时,send 调用close,receive 判断返回的 bool false 为关闭
*/
func tChanCom() {
done := make(chan struct{})
c2 := make(chan int)
arr := []int{0,1,2,3,4,5,6,7,8}
arr1 := []int{10,11,12,13,14,15,16,17,18}
for k, v := range arr{
go func(k, v int) {
for _, v1 := range arr1 {
go func(k, v1 int){
fmt.Println("v v1", v, v1)
if k % 2 == 0 {
c2 <- v1
}
if len(arr) - 1 == k {
//遍历到最外层for最后一个
//最后一个send 结束 要close
close(c2)
}
}(k, v1)
}
}(k, v)
}
go func(){
for{
select{
case v,ok := <-c2:
if !ok {
fmt.Println("c2 closed:", v, ok)
close(done)
}
fmt.Println("read v",v)
}
}
}()
<-done
}