ホームページ  >  記事  >  バックエンド開発  >  値が false の場合、gRPC はブール値を返しません。

値が false の場合、gRPC はブール値を返しません。

PHPz
PHPz転載
2024-02-10 09:30:09491ブラウズ

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

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 を使用する場合は、実行時にオーバーライドしてください (例:
  • )
リーリー
  • または、json を自分でエクスポートする場合は、標準ライブラリ (encoding/json) を使用する代わりに、このパッケージ google.golang の json マーシャラー を使用します。 org/protobuf/encoding/protojson":
リーリー

この回答で述べたように。

以上が値が false の場合、gRPC はブール値を返しません。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。