[英]Go Protobuf declarations and optional Fields in Go Struct (string pointers)
我在使用 Protoc 和包含可為空字符串字段的現有結構時遇到了一些問題。
我試圖序列化以進行傳輸的結構包含一堆在 json 中可為空的字段(因此我們可以區分null
、 ""
和設置值)。
type Message struct {
Path *string `json:"path"`
}
因此,如果用戶發送一個空的 json 字符串{}
Path 將為nil
而不是""
,而{"path":""}
也是有效的並且與{"path": null}
。
我想出的proto3
聲明顯然是這樣的(並且根據required
是可選的,而optional
已從 proto3 中刪除:
syntax = "proto3";
message Message {
string Path = 1;
}
運行 Protoc 后,我最終得到一個看起來像這樣的結構,所有值都是string
,無法將它們聲明為*string
:
type Message struct {
Path string `protobuf:"bytes,1,opt,name=Path,proto3" json:"Path,omitempty"`
}
顯然我不能從我現有的結構中分配給這個數組。 但是,即使我用target.Path = *source.Path
和適當的空指針檢查等編寫乏味的映射代碼,我也會失去源結構的三重含義( nil
、 ""
、 "value"
)。
關於如何在此處進行或是否有 Go Protobuf 的擴展來執行此操作的任何建議? 或者如何描述這個 proto 聲明?
https://stackoverflow.com/a/62566052 proto3 支持可選標志--experimental_allow_proto3_optional
就我而言,我用幾個包解決了這個問題:
我的 proto 文件如下所示:
syntax = "proto3";
import "google/protobuf/wrappers.proto";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
message Message {
google.protobuf.StringValue path = 1 [(gogoproto.wktpointer) = true];
}
我使用的生成 go 代碼的命令如下所示:
protoc -I. -I%GOPATH%/src --gogofaster_out=plugins=grpc:. proto/*.proto
生成的 go 文件如下所示:
type Message struct {
Path *string `protobuf:"bytes,1,opt,name=path,json=path,proto3,wktptr" json:"path,omitempty"`
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.