Maison > développement back-end > Golang > le corps du texte

gRPC ne renvoie pas de valeur booléenne si la valeur est fausse

PHPz
Libérer: 2024-02-10 09:30:09
avant
461 Les gens l'ont consulté

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

L'éditeur php Baicao a souligné lors de l'introduction de l'utilisation de gRPC que si la valeur spécifiée est fausse dans la requête gRPC, alors gRPC ne renverra pas de valeur booléenne. Cela signifie que lors de l'utilisation de gRPC, nous devons faire attention à la manière dont les valeurs de retour sont gérées pour éviter toute confusion et erreurs. Comprendre ce détail nous aidera à mieux comprendre et appliquer les fonctions de gRPC, et à améliorer l'efficacité de notre programmation et la qualité de notre code. Examinons davantage de fonctionnalités et d'utilisation de gRPC pour apporter de meilleures performances et évolutivité à nos projets.

Contenu des questions

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
}
Copier après la connexion
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr

J'ai un enregistrement dans la base de données |Numéro |Titre |Terminé | |-|-|-| | 1 |Ahhh|Faux|

La fonction ci-dessus renvoie {"todos": [{"id": "1", "title": "aaa"}]} 但一旦我将 is_completed 更改为 true ,结果是正确的 {"todos ": [{"id": "1", "title": "aaa", "iscompleted": true}]}

Solution

C'est par conception et pour améliorer l'efficacité.

bool 的“零”值是 false - 因此,当使用 false 值初始化 protobuf 结构时,在使用标准库的 encoding/json 解组器时不需要显式声明该字段。在编码端,如果字段的 json 标记包含 omitempty 限定符,则标准库的 encoding/json Le marshaleur supprimera toutes les valeurs nulles - c'est ce que vous voyez. Vous verrez le même comportement si title 字符串字段是 "" (c'est-à-dire la valeur zéro de la chaîne).

Voir le code généré (*.pb.go),结构体的 bool Les définitions de champs ressembleront à ceci :

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;
    }
}
Copier après la connexion
Copier après la connexion

Par conséquent json:"...,omitempty" 指示 encoding/json le marshaleur omet toutes les valeurs nulles lors du marshaling à l'aide de ces balises.

Si vous souhaitez ignorer ce comportement :

  • Il est possible de supprimer la directive omitempty du code généré (non recommandé - en raison de la nécessité de gérer l'édition pendant le cycle de vie du développement). Mais si vous devez le faire, consultez cette réponse ;
  • Si vous utilisez grpc-gateway, veuillez le remplacer au moment de l'exécution, par exemple
  • .
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;
    }
}
Copier après la connexion
Copier après la connexion
  • Ou, si vous exportez vous-même json, sans utiliser la bibliothèque standard (encoding/json),而是使用此包中的 json 封送拆收器 "google.golang.org/protobuf/encoding/protojson" :
type todo struct {
    // ...
    iscompleted  bool  `protobuf:"varint,5,opt,name=is_complete,proto3" json:"is_complete,omitempty"`
}
Copier après la connexion

Comme mentionné dans cette réponse.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!