php エディター Baicao は、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 }れーれー
データベースにレコードがあります |番号 |タイトル |完了 | |-|-|-| | 1 |ああ|間違い|
上記の関数は {"todos": [{"id": "1", "title": "aaa"}]}
を返しますが、is_completed
を変更すると、 true
、結果は正しいです{"todos ": [{"id": "1", "title": "aaa", "iscompleted": true}]}
これは設計によるもので、効率を向上させるためのものです。
bool
の「ゼロ」値は false
です。したがって、protobuf
構造体が false
値で初期化されると、標準を使用する ライブラリの encoding/json
アンマーシャラーを使用する場合、このフィールドを明示的に宣言する必要はありません。エンコード側では、フィールドの json タグに omitempty
修飾子が含まれている場合、標準ライブラリの encoding/json
マーシャラーはゼロ値を削除します。これが表示される内容です。
title
文字列フィールドが ""
(つまり、文字列のゼロ値) の場合も、同じ動作が見られます。
生成されたコード (*.pb.go
) を表示すると、構造体の bool
フィールド定義は次のようになります:
したがって、json:"...,omitempty"
は、encoding/json
マーシャラーに対して、これらのタグを使用したマーシャリング中にゼロ値を省略するように指示します。
この動作をオーバーライドする場合:
omitempty
ディレクティブを削除することができます (開発ライフサイクル中に編集を管理する必要があるため、推奨されません)。ただし、これを行う必要がある場合は、この回答;grpc-gateway
を使用する場合は、実行時にオーバーライドしてください (例: encoding/json
) を使用する代わりに、このパッケージ google.golang の json
マーシャラー を使用します。 org/protobuf/encoding/protojson"
:この回答で述べたように。
以上が値が false の場合、gRPC はブール値を返しません。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。