Ответ 1
Идиоматический способ - это использовать интерфейсы, а затем сделать утверждение типа на принимающей стороне. Ваша структура Event
в идеале должна быть интерфейсом.
type Event interface {
// Methods defining data all events share.
}
type UserEvent struct {
Name string
}
// Define methods on *UserEvent to have it qualify as Event interface.
type LoginEvent struct {
...
}
// Define methods on *LoginEvent to have it qualify as Event interface.
Затем вы можете определить свой канал, чтобы принять все, что соответствует интерфейсу Event
.
ch := make(chan Event)
Получающая сторона получит объекты Event
и может сделать утверждение типа, чтобы увидеть, что
бетонный тип лежит в основе:
select {
case evt := <- ch:
if evt == nil {
return
}
switch evt.(type) {
case *LoginEvent:
case *UserEvent:
....
}
}