Simple generic C# like events in Go
I needed a simple generic event system like the one in C# so here’s my solution
type EventHandler[Tsource any, Tdata any] func(source Tsource, data Tdata)
type EventSource[Tsource any, Tdata any] struct {
handler map[int]EventHandler[Tsource, Tdata]
handlerID int
}
func (s *EventSource[Tsource, Tdata]) AddHandler(handler EventHandler[Tsource, Tdata]) int {
s.handlerID++
s.handler[s.handlerID] = handler
return s.handlerID
}
func (s *EventSource[Tsource, Tdata]) RemoveHandler(id int) {
delete(s.handler, id)
}
func (s *EventSource[Tsource, Tdata]) Raise(source Tsource, data Tdata) {
for _, handler := range s.handler {
handler(source, data)
}
}
func NewEventSource[Tsource any, Tdata any]() *EventSource[Tsource, Tdata] {
return &EventSource[Tsource, Tdata]{
handler: make(map[int]EventHandler[Tsource, Tdata]),
}
}
Usage example:
package main
type Person struct {
age int
onAgeChanged *EventSource[*Person, int]
}
func (p *Person) SetAge(value int) {
p.age = value
p.onAgeChanged.Raise(p, value)
}
func NewPerson() *Person {
return &Person{
onAgeChanged: NewEventSource[*Person, int](),
}
}
func main() {
p := NewPerson()
p.onAgeChanged.AddHandler(func (source *Person, data int) {
//-- age has changed
})
p.SetAge(42)
}