包含0个元素的重复字段在客户端无效

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)