首頁 > 後端開發 > Golang > 主體

如果值為 false,gRPC 不會傳回布林值

PHPz
發布: 2024-02-10 09:30:09
轉載
461 人瀏覽過

如果值为 false,gRPC 不会返回布尔值

php小編百草在介紹gRPC的使用時指出,如果在gRPC請求中,指定的值為false,那麼gRPC將不會傳回布林值。這意味著在使用gRPC時,我們需要注意如何處理回傳值,以免造成混淆和錯誤。了解這個細節將幫助我們更好地理解和應用gRPC的功能,提高我們的程式設計效率和程式碼品質。讓我們一起深入研究gRPC的更多特性和用法,為我們的專案帶來更好的效能和擴充性。

問題內容

func (m *todoserver) gettodos(ctx context.context, empty *emptypb.empty) (*desc.gettodosresponse, error) {
    todos, err := m.todoservice.gettodos()
    if err != nil {
        return nil, err
    }

    todosresp := make([]*desc.gettodosresponse_todo, 0, len(todos))
    for _, todo := range todos {
        todosresp = append(todosresp, &desc.gettodosresponse_todo{
            id:          todo.id,
            title:       todo.title,
            iscompleted: todo.iscompleted,
        })
    }

    return &desc.gettodosresponse{todos: todosresp}, nil
}
登入後複製
service TodoService {
    rpc GetTodos(google.protobuf.Empty) returns (GetTodosResponse) {}
}

message GetTodosResponse {
    repeated Todo todos = 1;
    message Todo {
        int64 id = 1;
        string title = 2;
        bool is_completed = 3;
    }
}
登入後複製
登入後複製
service TodoService {
    rpc GetTodos(google.protobuf.Empty) returns (GetTodosResponse) {}
}

message GetTodosResponse {
    repeated Todo todos = 1;
    message Todo {
        int64 id = 1;
        string title = 2;
        bool is_completed = 3;
    }
}
登入後複製
登入後複製

我在資料庫中有一筆記錄 |編號 |標題 |完成 | |-|-|-| | 1 |啊啊|假|

上面的函數回傳{"todos": [{"id": "1", "title": "aaa"}]} 但一旦我將is_completed 更改為true ,結果是正確的{"todos ": [{"id": "1", "title": "aaa", "iscompleted": true}]}

解決方法

這是設計使然,也是為了提高效率。

bool 的「零」值是false - 因此,當使用false 值初始化protobuf 結構時,在使用標準庫的encoding/json 解組器時不需要明確宣告該欄位。在編碼端,如果欄位的json 標記包含omitempty 限定符,則標準庫的encoding/json 封送拆收器將刪除任何零值- 這就是您所看到的。 如果 title 字串欄位是 "" (即字串的零值),您將看到相同的行為。

查看產生的程式碼(*.pb.go),結構體的 bool 欄位定義將如下所示:

type todo struct {
    // ...
    iscompleted  bool  `protobuf:"varint,5,opt,name=is_complete,proto3" json:"is_complete,omitempty"`
}
登入後複製

因此 json:"...,omitempty" 指示 encoding/json 封送拆收器在使用這些標籤進行封送期間省略任何零值。

如果您想覆寫此行為:

  • 可以從產生的程式碼中刪除 omitempty 指令(不建議 - 因為需要在開發的生命週期中管理編輯)。但如果您必須這樣做,請參閱此答案;
  • 如果使用 grpc-gateway,請在運行時覆寫它,例如
gwmux := runtime.newservemux(runtime.withmarshaleroption(runtime.mimewildcard, &runtime.jsonpb{origname: true, emitdefaults: true}))
登入後複製
  • 或者,如果自己匯出json,則不使用標準函式庫(encoding/json),而是使用此套件中的json 封送拆收器" google.golang.org/protobuf/encoding/protojson":
protojson.Marshaler{EmitDefaults: true}.Marshal(w, resp)
登入後複製

此答案所述。

以上是如果值為 false,gRPC 不會傳回布林值的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!