如果值為 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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

語言多線程可以大大提升程序效率,C 語言中多線程的實現方式主要有四種:創建獨立進程:創建多個獨立運行的進程,每個進程擁有自己的內存空間。偽多線程:在一個進程中創建多個執行流,這些執行流共享同一內存空間,並交替執行。多線程庫:使用pthreads等多線程庫創建和管理線程,提供了豐富的線程操作函數。協程:一種輕量級的多線程實現,將任務劃分成小的子任務,輪流執行。

C語言標準庫中沒有名為“sum”的函數。 “sum”通常由程序員定義或在特定庫中提供,其功能取決於具體實現。常見的場景是針對數組求和,還可用於其他數據結構,如鍊表。此外,“sum”在圖像處理和統計分析等領域也有應用。一個優秀的“sum”函數應具有良好的可讀性、健壯性和效率。

是的,H5頁面製作是前端開發的重要實現方式,涉及HTML、CSS和JavaScript等核心技術。開發者通過巧妙結合這些技術,例如使用<canvas>標籤繪製圖形或使用JavaScript控制交互行為,構建出動態且功能強大的H5頁面。

如何使用JavaScript或CSS控制瀏覽器打印設置中的頁首和頁尾在瀏覽器的打印設置中,有一個選項可以控制是否顯�...

關於inline-block元素錯位顯示的原因及解決方案在編寫網頁佈局時,我們常常會遇到一些看似奇怪的顯示問題。比...

如何實現分段器的45度曲線效果?在實現分段器的過程中,如何讓點擊左側按鈕時右側邊框變成45度曲線,而點�...

CSS自定義resize符號的方法與背景色統一在日常開發中,我們經常會遇到需要自定義用戶界面細節的情況,比如調...

std::unique 去除容器中的相鄰重複元素,並將它們移到末尾,返回指向第一個重複元素的迭代器。 std::distance 計算兩個迭代器之間的距離,即它們指向的元素個數。這兩個函數對於優化代碼和提升效率很有用,但也需要注意一些陷阱,例如:std::unique 只處理相鄰的重複元素。 std::distance 在處理非隨機訪問迭代器時效率較低。通過掌握這些特性和最佳實踐,你可以充分發揮這兩個函數的威力。
