Skip to content

Instantly share code, notes, and snippets.

@davidmz
Created April 12, 2014 10:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save davidmz/10529299 to your computer and use it in GitHub Desktop.
Save davidmz/10529299 to your computer and use it in GitHub Desktop.
Простой броадкастер на Go
package bcast
type Broadcaster interface {
// Неблокирующая отправка сообщения
Send(interface{})
// Блокирующее получение одного сообщения
Fetch() interface{}
}
type bcaster struct {
in chan interface{}
listeners chan chan interface{}
}
func NewBroadcaster() Broadcaster {
b := &bcaster{
in: make(chan interface{}),
listeners: make(chan chan interface{}),
}
go b.run()
return b
}
func (b *bcaster) Send(v interface{}) {
go func() { b.in <- v }()
}
func (b *bcaster) Fetch() interface{} {
ch := make(chan interface{})
b.listeners <- ch
v := <-ch
close(ch)
return v
}
func (b *bcaster) run() {
for {
v := <-b.in
loop:
for {
select {
case ch := <-b.listeners:
go func() { ch <- v }()
default:
break loop
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment