簡體   English   中英

Go Struct 中的 Go Protobuf 聲明和可選字段(字符串指針)

[英]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 聲明?

即使未設置字段,Proto3 也會返回零值 目前無法區分字段是否已設置。

請參閱 Github 問題#15

可能的解決方案:

https://stackoverflow.com/a/62566052 proto3 支持可選標志--experimental_allow_proto3_optional

就我而言,我用幾個包解決了這個問題:

  1. https://github.com/gogo/protobuf
  2. https://github.com/golang/protobuf

我的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM