protobuf 生成 go 类型指针 pointer 问题 proto3定义指针
我们要区分 null,""和一个设定值,需要使用 *string 类型
type Message struct { Path *string `json:"path"` }
用户发送一个空的 json 字符串{},则 Path 将是 nil 而不是"";但是{"path":""}却是有效的
但是 proto3 中 required 被废弃,无法定义pointer 了
解决 proto3 可以定义 pointer
使用 gogoproto's nullable 扩展.
使用 google.protobuf.FieldMask 扩展, 请参阅 Google API 设计指南中的常见设计模式: Partial Responses 和 Output Fields.
proto3定义指针类型 最佳解决方案:
在 protobuf 3.15 之后,我们可以加 optional 来完美解决
第一步:
message oooooo { optional string name = 1; string add = 2; }
第二步骤
在编译时候,需要加 --experimental_allow_proto3_optional
protoc -I=.app/*/pb/*.proto --experimental_allow_proto3_optional
最后生成
type Oooooo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Name *string `protobuf:"bytes,1,opt,name=name,proto3,oneof" json:"name,omitempty"` Add string `protobuf:"bytes,2,opt,name=add,proto3" json:"add,omitempty"` }
参考:
Go Protobuf declarations and optional Fields in Go Struct (string pointers)
github #15 proto3 no-longer generates pointers to fields
共 0 条评论