2012-11-16 9 views
19

GOLANGでは、チャネル間の多態性の動作のために構造体をキャストするのは簡単ですか? 1つのチャンネルに異なるバージョンの構造体を送信しようとしています。たとえば、LoginEventのようなさまざまなタイプのイベントを作成します。それぞれ構造体のデータ量が異なります。チャンネルを介して送信するために構造体をキャストする方法はありますか

package main 

import "fmt" 


type Event struct { 
    EvtType EvtType 
    Username string 
    Data string 
} 


type LoginEvent struct { 
    Event 
    CallBackChannel chan *Event 
} 


type EvtType int 

const (
    Login EvtType = iota+1 
    Logout 
    ChatMessage 
    Presense 
    BuddyList 
) 


func main() { 
    fakeOutputChan := make(chan<- *Event) 

     ourSrvChannel := make(chan *Event) 
     lg := (LoginEvent{Event{Login,"",""} ,ourSrvChannel}) 
    fakeOutputChan <- (*Event)(&lg) 

    fmt.Println("Hello, playground") 
} 

答えて

24

慣用的なやり方は、インターフェイスを使用し、受信側でタイプアサーションを行うことです。あなたの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: 

    .... 
    } 
} 
関連する問題