Editor PHP Baicao menegaskan semasa memperkenalkan penggunaan gRPC bahawa jika nilai yang ditentukan adalah palsu dalam permintaan gRPC, maka gRPC tidak akan mengembalikan nilai Boolean. Ini bermakna apabila menggunakan gRPC, kita perlu memberi perhatian kepada cara nilai pulangan dikendalikan untuk mengelakkan kekeliruan dan ralat. Memahami butiran ini akan membantu kami lebih memahami dan menggunakan fungsi gRPC serta meningkatkan kecekapan pengaturcaraan dan kualiti kod kami. Mari kita mendalami lebih banyak ciri dan penggunaan gRPC untuk membawa prestasi dan kebolehskalaan yang lebih baik kepada projek kami.
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; } }
Saya mempunyai rekod dalam pangkalan data |Nombor |Tajuk |Selesai | |-|-|-| |. 1 |Ahhh|Salah|
Fungsi di atas mengembalikan {"todos": [{"id": "1", "title": "aaa"}]}
但一旦我将 is_completed
更改为 true
,结果是正确的 {"todos ": [{"id": "1", "title": "aaa", "iscompleted": true}]}
Ini adalah dengan reka bentuk dan untuk meningkatkan kecekapan.
bool
的“零”值是 false
- 因此,当使用 false
值初始化 protobuf
结构时,在使用标准库的 encoding/json
解组器时不需要显式声明该字段。在编码端,如果字段的 json 标记包含 omitempty
限定符,则标准库的 encoding/json
Marshaler akan mengalih keluar sebarang nilai sifar - itulah yang anda lihat.
Anda akan melihat gelagat yang sama jika title
字符串字段是 ""
(iaitu nilai sifar rentetan).
Lihat kod yang dijana (*.pb.go
),结构体的 bool
Takrif medan akan kelihatan seperti ini:
type todo struct { // ... iscompleted bool `protobuf:"varint,5,opt,name=is_complete,proto3" json:"is_complete,omitempty"` }
Oleh itu json:"...,omitempty"
指示 encoding/json
marshaler meninggalkan sebarang nilai sifar semasa marshaling menggunakan tag ini.
Jika anda ingin mengatasi tingkah laku ini:
omitempty
daripada kod yang dijana (tidak disyorkan - kerana keperluan untuk menguruskan penyuntingan semasa kitaran hayat pembangunan). Tetapi jika anda mesti melakukan ini, lihat jawapan ini;grpc-gateway
, sila gantikannya semasa masa jalan, mis
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)
jawapan ini.
Atas ialah kandungan terperinci gRPC tidak mengembalikan nilai boolean jika nilainya palsu. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!