具有 0 个元素的重复字段会导致客户端为零

hyp*_*low 6 go protocol-buffers grpc

问题:

我想知道为什么当服务器响应字段上的空切片时,我在 gRPC 客户端上得到nilrepeated值?

是否有任何参考/文档明确描述此行为?


考虑以下示例:

简单的原型文件定义:

syntax = "proto3";

option go_package = "testdata";

service Greeter {
    rpc Hello (HelloRequest) returns (HelloResponse) {}
}

message HelloRequest {
    string name = 1;
}

message HelloResponse {
    repeated string greetings = 1;
}
Run Code Online (Sandbox Code Playgroud)

迎宾服务实施:

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
}
Run Code Online (Sandbox Code Playgroud)

服务器实现:

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)
}
Run Code Online (Sandbox Code Playgroud)

客户端代码:

    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())
Run Code Online (Sandbox Code Playgroud)

结果输出:

[]string(nil)
Run Code Online (Sandbox Code Playgroud)