dtp19819 2018-04-16 16:57
浏览 28

包含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)
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 微信小程序协议怎么写
    • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
    • ¥20 怎么用dlib库的算法识别小麦病虫害
    • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
    • ¥15 java写代码遇到问题,求帮助
    • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
    • ¥15 有了解d3和topogram.js库的吗?有偿请教
    • ¥100 任意维数的K均值聚类
    • ¥15 stamps做sbas-insar,时序沉降图怎么画
    • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看