0
点赞
收藏
分享

微信扫一扫

go chan goroutine send & receive

上善若水的道 2022-01-30 阅读 82
/**
 * 结论:
 * 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
}
举报

相关推荐

0 条评论