2012-11-16 13 views

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: 

    .... 
    } 
} 
Problemi correlati