亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

Go
皈依舞 2023-07-04 15:41:23
我在 Protoc 和包含可為空字符串字段的現有結構中遇到了一些問題。我嘗試序列化以進行傳輸的結構包含一堆在 json 中可為空的字段(因此我們可以區分null,""和設置值)。type Message struct {  Path *string `json:"path"`}因此,如果用戶發送空 json 字符串,{}則 Path 將為nil且不是"",而{"path":""}也是有效的且與 不同{"path": null}。proto3我提出的聲明顯然看起來像這樣(并且是可選的,并且required從optionalproto3 中刪除了: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 是否有擴展來執行此操作?或者如何描述這個原始聲明?
查看完整描述

3 回答

?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

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

可能的解決方案:

  • 使用proto2而不是proto3。

  • 使用 gogoproto 的可為空擴展。

  • 使用google.protobuf.FieldMask擴展,請參閱 Google API 設計指南中的常見設計模式:部分響應和輸出字段。


查看完整回答
反對 回復 2023-07-04
?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

proto3 支持可選帶標志--experimental_allow_proto3_optional



查看完整回答
反對 回復 2023-07-04
?
Smart貓小萌

TA貢獻1911條經驗 獲得超7個贊

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

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

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

我的原型文件如下所示:

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"`

}


查看完整回答
反對 回復 2023-07-04
  • 3 回答
  • 0 關注
  • 366 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號