Maison > Article > développement back-end > gRPC ne renvoie pas de valeur booléenne si la valeur est fausse
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.
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 }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}]}
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; } }
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 :
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 ;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; } }
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"` }
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!