有没有办法强制转换结构以通过通道发送
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:
....
【讨论】:
以上是关于有没有办法强制转换结构以通过通道发送的主要内容,如果未能解决你的问题,请参考以下文章
强制定义 Go 结构以将 unsafe.Pointer() 转换为 C 结构
使用 json_encode,有没有办法强制某些值不转换为数字?