有两个通道将通过关闭它们来发送信号。如果至少其中之一关闭,如何从它们中关闭一个通道。这段代码说明了我想做什么:
func MergeChans(c1 chan struct{}, c2 chan struct{}) chan struct{} {
c3 := make(chan struct{})
go func() {
select {
case <-c1: close(c3)
case <-c2: close(c3)
}
}()
return c3
}
有没有子程序就可以实现吗?
答案 0 :(得分:1)
如果要在需要关闭之前返回“合并”通道,则不会。
但这不是问题,您在内部启动的goroutine将使用0 CPU资源。您不必为此担心。
一旦其中一个通道关闭,该函数将终止,因此goroutine将正确终止。您只需要确保关闭至少一个通道即可。如果您不能保证这一点,goroutine将永远不会终止,也永远不会被垃圾回收。如果您不控制频道,则可以传递第三个频道(或context.Context
值)以提供适当的终止方式,例如:
func MergeChans(c1, c2, shutdown chan struct{}) chan struct{} {
c3 := make(chan struct{})
go func() {
select {
case <-c1:
close(c3)
case <-c2:
close(c3)
case <-shutdown:
}
}()
return c3
}
如果要避免使用多余的goroutine,请不要合并它们(在需要监视它们的位置添加2个case
)。