+-
golang中的联合体
首页 专栏 golang 文章详情
0

golang中的联合体

o_ra 发布于 1 月 22 日

昨天使用protobuf中的oneof发现编译出来的代码挺奇怪的,详细看看发现golang中使用联合体是这样用的

定义一个接口类型,这个接口类型就一个方法,实现了这个方法就可以赋值了。

type msgPayload interface {
    msgPayload()
}

要使用联合体的地方使用接口代替

type Message struct {
    Payload msgPayload
}

然后就可以分别定义各个结构了,只需要添加定义的空接口就行了

type MsgA struct {
    A uint32
}
func (*MsgA) msgPayload() {}

同样使用的时候,定义结构体

msgA := Message{Payload:&MsgA{A: 000}}

读取时候使用

switch msgB.Payload.(type) {
    case *MsgA:
        fmt.Println("*MsgA")
    ......
}
golang 接口
阅读 54 发布于 1 月 22 日
赞 收藏
分享
本作品系原创, 采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
avatar
o_ra
0 声望
0 粉丝
关注作者
0 条评论
得票 时间
提交评论
avatar
o_ra
0 声望
0 粉丝
关注作者
宣传栏

昨天使用protobuf中的oneof发现编译出来的代码挺奇怪的,详细看看发现golang中使用联合体是这样用的

定义一个接口类型,这个接口类型就一个方法,实现了这个方法就可以赋值了。

type msgPayload interface {
    msgPayload()
}

要使用联合体的地方使用接口代替

type Message struct {
    Payload msgPayload
}

然后就可以分别定义各个结构了,只需要添加定义的空接口就行了

type MsgA struct {
    A uint32
}
func (*MsgA) msgPayload() {}

同样使用的时候,定义结构体

msgA := Message{Payload:&MsgA{A: 000}}

读取时候使用

switch msgB.Payload.(type) {
    case *MsgA:
        fmt.Println("*MsgA")
    ......
}