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 jikatitle
字符串字段是""
(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 itujson:"...,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, lihatjawapan ini;grpc-gateway
, sila gantikannya semasa masa jalan, misgwmux := 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!