Question:
I wonder why do I get nil value on gRPC client when server responds with
empty slice on repeated
field?
Is there any reference/documentation explicitly describing this behavior?
Consider the following example:
Simple proto file definitions:
syntax = "proto3";
option go_package = "testdata";
service Greeter {
rpc Hello (HelloRequest) returns (HelloResponse) {}
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
repeated string greetings = 1;
}
Greeter service implementation:
type Hello struct{}
func (*Hello) Hello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
return &pb.HelloResponse{
Greetings: []string{}, // Note: a slice with 0 elements (not nil slice)
}, nil
}
Server implementation:
srv := grpc.NewServer()
pb.RegisterGreeterServer(srv, &Hello{})
lis, err := net.Listen("tcp", ":8123")
if err != nil {
panic(err)
}
if err := srv.Serve(lis); err != nil {
panic(err)
}
Client code:
cc, err := grpc.Dial(":8123", grpc.WithBlock(), grpc.WithInsecure())
if err != nil {
panic(err)
}
client := testdata.NewGreeterClient(cc)
resp, err := client.Hello(context.TODO(), &testdata.HelloRequest{})
if err != nil {
panic(err)
}
fmt.Printf("%#v", resp.GetGreetings())
Result output:
[]string(nil)