【问题标题】: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 := (LoginEvent{Event{Login,"",""} ,ourSrvChannel})
    fakeOutputChan <- (*Event)(&lg)

    fmt.Println("Hello, playground")
}

【问题讨论】:

    标签: struct go channel


    【解决方案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:
    
        ....
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-28
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      相关资源
      最近更新 更多