golang:关于处理Protobuf中oneof类型的的一个问题记录

下面是关于一个包含oneof类型的message

message Person{
  //oneof 这个范围内的字段只会选取一个,写了丈夫就没有妻子
  oneof company{
    string Husband=8;
    string Wife =11;
  };
};

在处理完成引入go文件,然后创造一个Person实例,并输出Company当中wife的名称

example := pd.Person{
	Company:   &pd.Person_Wife{Wife: "gss"},
}
//尝试输出Wife名称
fmt.Println(example.Company.Wife)

这时候编辑器会在Wife字段下面加hongse浪线,这就是我遇到的问题,命名结构体当中有这个属性却不能输出。

看了一下protoc生成的文件pd文件,原因在于oneof转换成go文件的时候,实际上生成的是一个接口,然后有Person_Wife和Person_Husband两种结构体实现了这个接口,这样的话就能在两个结构体指针当中二选其一,pd文件当中的内容如下:

type isPerson_Company interface {
	isPerson_Company()
}

type Person_Husband struct {
	Husband string `protobuf:"bytes,8,opt,name=Husband,proto3,oneof"`
}

type Person_Wife struct {
	Wife string `protobuf:"bytes,11,opt,name=Wife,proto3,oneof"`
}

func (*Person_Husband) isPerson_Company() {}

func (*Person_Wife) isPerson_Company() {}

所以上面example当中的Company就是个接口,需要对类型进行判断,然后在获取当中的属性,如下:

realStruct, _ := example.Company.(*pd.Person_Wife)
fmt.Println(realStruct.Wife) //这样就行了

以上,所以这也是多种选一的技巧啊

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值