门户网站类型,网站功能描述,北京大湖建设工程有限公司网站,灵璧县建设局网站背景
protobuf 2中定义的enum枚举值必须为数字类型#xff0c;故不支持string类型#xff0c;但有些业务场景又确实需要定义string常量。
目标
在protobuf 2中定义string常量。
方案
思路#xff1a;通optional default实现string常量。 细节#xff1a;
1、protobu…背景
protobuf 2中定义的enum枚举值必须为数字类型故不支持string类型但有些业务场景又确实需要定义string常量。
目标
在protobuf 2中定义string常量。
方案
思路通optional default实现string常量。 细节
1、protobuf定义
syntax proto2;
package stonelu.learn.pb;message Constant {message TestStringConst {optional string NO_TEST_STRING_CONST 1 [default no_test_string_const]; // val: no_test_string_constoptional string Email 2 [default email]; // val: emailoptional string Sex 3 [default sex]; // val: sexoptional string Address 4 [default address]; // val address}
}2、生成pb.go文件(文件名后缀由生成语言决定此处以go为例) 指令不在此赘述。 生成的文件关键信息如下注意中文注释部分:
type Constant_TestStringConst struct {NO_TEST_STRING_CONST *string protobuf:bytes,1,opt,nameNO_TEST_STRING_CONST,jsonNOTESTSTRINGCONST,defno_test_string_const json:NO_TEST_STRING_CONSTEmail *string protobuf:bytes,2,opt,nameEmail,defemail json:EmailSex *string protobuf:bytes,3,opt,nameSex,defsex json:SexAddress *string protobuf:bytes,4,opt,nameAddress,defaddress json:AddressXXX_unrecognized []byte json:-
}func (m *Constant_TestStringConst) Reset() { *m Constant_TestStringConst{} }
func (m *Constant_TestStringConst) String() string { return proto.CompactTextString(m) }
func (*Constant_TestStringConst) ProtoMessage() {}
func (*Constant_TestStringConst) Descriptor() ([]byte, []int) {return fileDescriptorSellerCsRouting, []int{0, 2}
}const Default_Constant_TestStringConst_NO_TEST_STRING_CONST string no_test_string_const
const Default_Constant_TestStringConst_Email string email
const Default_Constant_TestStringConst_Sex string sex
const Default_Constant_TestStringConst_Address string addressfunc (m *Constant_TestStringConst) GetNO_TEST_STRING_CONST() string {if m ! nil m.NO_TEST_STRING_CONST ! nil {return *m.NO_TEST_STRING_CONST}return Default_Constant_TestStringConst_NO_TEST_STRING_CONST
}func (m *Constant_TestStringConst) GetEmail() string {// 【核心代码】// 如果email字段有值则返回但其实一般不会对其做赋值if m ! nil m.Email ! nil {return *m.Email}// 一般都走下面这里返回默认值email// sex、address字段类同后面不再赘述return Default_Constant_TestStringConst_Email
}func (m *Constant_TestStringConst) GetSex() string {if m ! nil m.Sex ! nil {return *m.Sex}return Default_Constant_TestStringConst_Sex
}func (m *Constant_TestStringConst) GetAddress() string {if m ! nil m.Address ! nil {return *m.Address}return Default_Constant_TestStringConst_Address
}3、使用 v : (stonelu_learn_pb.Constant_TestStringConst{}).GetEmail()t.Logf(v: %v, v)