下面是关于一个包含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) //这样就行了
以上,所以这也是多种选一的技巧啊