In GOLANG c'è un modo semplice per trasmettere le strutture per il comportamento polimorfico attraverso i canali? Sto provando ad inviare versioni diverse di una struct su un canale, quindi per esempio avrò diversi tipi di eventi, come un LoginEvent. Ognuno avrà diverse quantità di dati nella struttura.C'è un modo per eseguire il cast di Structs per l'invio su un canale
19
A
risposta
24
Il modo idiomatico da fare è, è utilizzare le interfacce e quindi eseguire un tipo di asserzione sul lato ricevente. La tua struttura Event
dovrebbe essere idealmente un'interfaccia.
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.
Quindi è possibile definire il canale di accettare tutto ciò che si qualifica come l'interfaccia Event
.
ch := make(chan Event)
L'estremità di ricezione riceve gli oggetti Event
e può fare un tipo asserzione vedere che tipo concreto sottende:
select {
case evt := <- ch:
if evt == nil {
return
}
switch evt.(type) {
case *LoginEvent:
case *UserEvent:
....
}
}