golang 在多协程下, 不清楚谁是 sender 谁是 recver 的时候, close(chan) 和 chan<-data 两个都很容易报错
那么close 到底怎么才能更安全,更正确的,解决呢?
单协程 直接close ,太low,我们不考虑,只考虑最复杂环境下的情况.
第一种方法 暴力关闭channel ,只需要增加 recover() 就可以了
第二种方法 通过对变量加锁,或者直接使用sync.Once 来控制 close 只有一次
第三种方法 创建两个chan,一个永远不close,只进行 无限 发送, 单个接收; 一旦接收了 ,就关闭另外一个; 另外一个 返还给外部, 只判断 close的情况,不进行发送和直接close
第四种方法 比较简单,总是 使用select就可以了,
done := make(chan struct{})
// 复杂环境下 并发 进行关闭 select{ case <-done: default: close(done) }
//复杂环境 并发 检测是否关闭 select{ case <-done //关闭处理 return default: //没有关闭的处理 }
https://zhuanlan.zhihu.com/p/32529039