Go语言使用protobuf时应调用Get方法还是直接访问结构体字段?
Go Protobuf 字段访问方式说明
你定义的Proto结构如下:
message MyProtoStruct { string description = 1; }
针对你提出的两种字段取值方式,具体差异和适用场景如下:
两种方式均为合法用法
protoc 生成的Go代码同时支持直接访问结构体字段、调用自动生成的Get方法取值,没有强制要求必须用某一种,可根据实际场景选择。
两种方式的差异
- 直接访问
MyProtoStruct.Description- 优势:写法简洁直观,代码可读性更高
- 注意:需要自行保证访问的结构体实例不为nil,若实例为nil时直接访问字段会触发空指针panic;如果字段在proto中标记了
optional修饰,还需要额外判断字段指针是否为空,否则也可能触发panic
- 调用Get方法
MyProtoStruct.GetDescription()- 优势:自动生成的Get方法内置了非空校验逻辑,当结构体实例为nil、可选字段未赋值时,会直接返回对应类型的零值(比如string类型返回空字符串),不会触发panic,代码健壮性更高
- 适用场景:处理外部传入的未做合法性校验的protobuf实例、字段为可选类型、不确定实例/字段是否为空的场景下优先使用
常用最佳实践
如果是内部服务流转、你可以100%确定实例和字段都不为空的场景,直接访问字段即可,代码更简洁;如果是对外接口接收参数、跨服务传递的protobuf消息,优先使用Get方法,避免不必要的空指针异常。
内容的提问来源于stack exchange,提问作者Fred Hors
相关产品推荐
相关产品推荐

