2012-11-16 7 views

Antwort

24

Der idiomatische Weg zu tun ist, Schnittstellen zu verwenden und dann eine Typassertion auf der empfangenden Seite zu tun. Ihr Event struct sollte idealerweise eine Schnittstelle sein.

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. 

Dann können Sie Ihren Kanal definieren, alles zu akzeptieren, die als Event Schnittstelle qualifiziert.

ch := make(chan Event) 

Das Empfangsende werden die Event Objekte erhalten und eine Art Behauptung tun können, um zu sehen, was es konkreter zugrunde liegt:

select { 
case evt := <- ch: 
    if evt == nil { 
     return 
    } 

    switch evt.(type) { 
    case *LoginEvent: 

    case *UserEvent: 

    .... 
    } 
}