Если вы хотите вернуть «объединенный» канал до его закрытия, нет.
Но это не проблема, запускаемая вами процедура будет использовать 0 ресурсов ЦП. Вам не стоит об этом беспокоиться.
Как только один из каналов будет закрыт, функция завершится, и, таким образом, программа завершится правильно. Вам нужно только убедиться, что хотя бы один из каналов закрыт. Если вы не можете гарантировать это, программа никогда не прекратит работу и никогда не будет собирать мусор. Если вы не контролируете каналы, вы можете пропустить третий канал (или значение context.Context
), чтобы обеспечить способ правильного завершения, например ::10000
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
}
Если вы хотите избежать дополнительных процедур, не объединяйте их (добавьте 2 case
s, где они должны контролироваться).