https://play.golang.org/p/NJ-X38UrWC
В дополнение к комментарию на другой ответ.
package events
import (
"sync"
)
var events *Events
type Events struct {
sync.RWMutex
list map[string]func(ps []string)
}
func NewEventsList() (list *Events) {
list = new(Events)
list.list = make(map[string]func(ps []string))
return list
}
func init() {
events = NewEventsList()
}
func Add(name string, callback func(ps []string)) {
events.Add(name, callback)
}
func Call(name string, ps []string) bool {
return events.Call(name, ps)
}
// Подписка на событие
func (l *Events) Add(name string, callback func(ps []string)) {
l.Lock()
defer l.Unlock()
l.list[name] = callback
}
// Вызов события
func (l *Events) Call(name string, ps []string) bool {
l.RLock()
defer l.RUnlock()
if f, ok := l.list[name]; ok {
go f(ps)
return true
}
return false
}