我知道,如果有多个“通信”可以在select声明中进行,则随机选择一个。我正在尝试找到一种替代方法,它可以更喜欢一种“交流”而不是另一种。
背景是我正在使用上下文杀死的通道上的 go-routine 中发送值。当我杀死它时,我希望立即关闭通道,但目前代码有时会在关闭之前在通道上发送最终值。
这是代码的简化版本:
ctx, cancel := context.WithCancel(context.Background())
ch := make(chan int)
go func() {
defer close(ch)
for i := 1; ; i++ {
select {
case <-ctx.Done():
return
case ch <- i:
}
}
}()
print(<-ch)
print(<-ch)
cancel()
print(<-ch)
print(<-ch)
这有时会打印 1200,但通常会打印 1230。 在操场上尝试一下
关于如何重组代码以支持第一种情况有什么想法吗?(即让它总是打印 1200。)
波斯汪
幕布斯6054654
相关分类