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)
}