有没有办法强制转换结构以通过通道发送

Posted

技术标签:

【中文标题】有没有办法强制转换结构以通过通道发送【英文标题】:Is there a way to cast Structs for sending over a channel 【发布时间】:2012-11-05 16:53:27 【问题描述】:

在 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 := (LoginEventEventLogin,"","" ,ourSrvChannel)
    fakeOutputChan <- (*Event)(&lg)

    fmt.Println("Hello, playground")

【问题讨论】:

【参考方案1】:

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

    ....
    

【讨论】:

以上是关于有没有办法强制转换结构以通过通道发送的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法强制将单个数字Int转换为两位数的int值?

强制定义 Go 结构以将 unsafe.Pointer() 转换为 C 结构

使用 json_encode,有没有办法强制某些值不转换为数字?

在 C# 中强制转换数组而不制作副本

Microsoft Excel csv文件强制以UTF-8打开[重复]

为啥在以下结构定义中需要显式强制转换