请教一个 Go 的问题 如何确保缓冲 channel 关闭之后数据被全部读完呢?

2019 年 5 月 10 日
 mokeychan

如果不能确保的话,那么主线程会提前退出,部分数据就会被抛弃了?

2973 次点击
所在节点    Go 编程语言
6 条回复
SimonDing
2019 年 5 月 10 日
range 来耗尽 channel?
a719114136
2019 年 5 月 10 日
处理 channel 之前用 waitGroup 记一下,退出时等待 waitgroup 变为 0
dreampuf
2019 年 5 月 10 日
由 producer 关闭
liulaomo
2019 年 5 月 10 日
@SimonDing 说的对。

或者如下手动,其实和 for v := range c { use(v) } 是等价的。
for {
v, closed := <-c;
if closed (
break
}
// use v ...
}
cabing
2019 年 5 月 10 日
这个加个方法 waitGroup 监听下吧。

在主线程上加个 w.Add(1)

在这里可以手动关闭吧。 close(xxx)

wg.wait();

做一个开关 chan
go func(chan a interface{}){

for xxxx{
do something...
}
wg.done();

}
janxin
2019 年 5 月 11 日
代码组织设计时考虑,由生产者关闭

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/562994

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX