У меня есть приложение, в котором одна горутина в конечном итоге вычислит значение, и в этот момент любое количество подпрограмм, ожидающих этого значения, должно продолжить выполнение. Это проблема связи «один ко многим», поэтому я боролся с каналами и условными переменными, отслеживая количество ожидающих подпрограмм. Более того, я хотел, чтобы трансляция была неблокирующей, а будущие ожидания возвращались немедленно, поскольку значение известно.
Я закончил со следующей реализацией, где закрытие канала эффективно транслирует группу, поскольку запись происходит до любого из чтений, не должно быть никаких гонок. Хотя до сих пор отлично работает, мне кажется немного хакерским. Есть ли более идиоматичное, но простое решение этой проблемы?
type BroadcastGroup struct {
ch chan interface{}
msg interface{}
}
func (bg *BroadcastGroup) Broadcast(msg interface{}) {
bg.msg = msg
close(bg.ch)
}
func (bg *BroadcastGroup) Wait() interface{} {
<-bg.ch
return bg.msg
}
func NewBroadcastGroup() *BroadcastGroup {
bg := &BroadcastGroup{}
bg.ch = make(chan interface{}, 0)
return bg
}
sync.Cond
. - person Adrian   schedule 06.03.2018sync.Cond
. Без полного контекста мы не можем сказать, есть ли более простой шаблон, он и так довольно прост. - person JimB   schedule 06.03.2018