package main import ( "fmt" "time" ) // PubSub setup type SimpleSignalChannel chan int type SimpleSignal struct { sig SimpleSignalChannel } func NewSimpleSignal() *SimpleSignal { s := new(SimpleSignal) s.sig = make(SimpleSignalChannel) return s } func (s *SimpleSignal) WaitForSignal() { // block until channel closed for range s.sig { } } func (s *SimpleSignal) SignalAll() { // signal all sleeping subscribers by closing the old channel defer close(s.sig) // BUT FIRST make a new channel for any new subscribers s.sig = make(SimpleSignalChannel) } // example usage func subscriber(x int, ps *SimpleSignal) { for { ps.WaitForSignal() fmt.Println("subscriber", x, "got signal") } } func publisher(ps *SimpleSignal) { for { time.Sleep(time.Second * 3) fmt.Println("publishing") ps.SignalAll() fmt.Println("published signal") } } func main() { fmt.Println("starting subscribers") ps := NewSimpleSignal() for i := range 10 { go subscriber(i, ps) } fmt.Println("starting publisher") go publisher(ps) select {} }