有没有一种方法可以将结构体转换为可发送到通道的格式?

21
在GOLANG中,有没有一种简单的方法可以将结构体进行类型转换,以便在通道上实现多态行为?我正在尝试通过一个通道发送不同版本的结构体,例如我将拥有不同类型的事件,比如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")
}
1个回答

27

惯用的方法是使用接口,然后在接收端进行类型断言。你的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:

    ....
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接