php-Editor Baicao wies bei der Einführung der Verwendung von gRPC darauf hin, dass gRPC keinen booleschen Wert zurückgibt, wenn der angegebene Wert in der gRPC-Anfrage falsch ist. Das bedeutet, dass wir bei der Verwendung von gRPC darauf achten müssen, wie mit Rückgabewerten umgegangen wird, um Verwirrung und Fehler zu vermeiden. Das Verständnis dieser Details wird uns helfen, die Funktionen von gRPC besser zu verstehen und anzuwenden sowie unsere Programmiereffizienz und Codequalität zu verbessern. Schauen wir uns weitere Funktionen und die Verwendung von gRPC an, um die Leistung und Skalierbarkeit unserer Projekte zu verbessern.
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; } }
Ich habe einen Eintrag in der Datenbank |Nummer |Titel |Abgeschlossen | |-|-|-| |. 1 |Ahhh|Falsch|
Die obige Funktion gibt {"todos": [{"id": "1", "title": "aaa"}]}
但一旦我将 is_completed
更改为 true
,结果是正确的 {"todos ": [{"id": "1", "title": "aaa", "iscompleted": true}]}
zurück. Dies ist beabsichtigt und soll die Effizienz verbessern.
bool
的“零”值是 false
- 因此,当使用 false
值初始化 protobuf
结构时,在使用标准库的 encoding/json
解组器时不需要显式声明该字段。在编码端,如果字段的 json 标记包含 omitempty
限定符,则标准库的 encoding/json
Der Marshaller entfernt alle Nullwerte – das sehen Sie.
Sie werden das gleiche Verhalten sehen, wenn title
字符串字段是 ""
(d. h. der Nullwert der Zeichenfolge).
Sehen Sie sich den generierten Code an (*.pb.go
),结构体的 bool
Die Felddefinitionen sehen folgendermaßen aus:
type todo struct { // ... iscompleted bool `protobuf:"varint,5,opt,name=is_complete,proto3" json:"is_complete,omitempty"` }
Deshalb json:"...,omitempty"
指示 encoding/json
lässt der Marshaller beim Marshalling mithilfe dieser Tags alle Nullwerte aus.
Wenn Sie dieses Verhalten überschreiben möchten:
omitempty
-Direktive aus dem generierten Code zu entfernen (nicht empfohlen – da die Bearbeitung während des Entwicklungslebenszyklus verwaltet werden muss). Wenn Sie dies jedoch tun müssen, lesen Sie diese Antwort;grpc-gateway
verwenden, überschreiben Sie es bitte zur Laufzeit, z. B. gwmux := runtime.newservemux(runtime.withmarshaleroption(runtime.mimewildcard, &runtime.jsonpb{origname: true, emitdefaults: true}))
encoding/json
),而是使用此包中的 json
封送拆收器 "google.golang.org/protobuf/encoding/protojson"
:protojson.Marshaler{EmitDefaults: true}.Marshal(w, resp)
Wie in dieser Antwort erwähnt.
Das obige ist der detaillierte Inhalt vongRPC gibt keinen booleschen Wert zurück, wenn der Wert falsch ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!