21

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")
}
4

1 に答える 1

26

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

    ....
    }
}
于 2012-11-16T23:12:57.123 に答える