proto使用结构体数组时gRPC调用类型不匹配,Go代码应如何修改?
问题根因
- gRPC方法
MyMethod的入参要求是*AnalyticsSet指针类型,你直接传入[]Analytics切片,类型完全不匹配,所以触发报错 - 你自定义的
Analytics结构体和protoc编译proto文件自动生成的Analytics类型属于两个完全独立的类型,即使字段定义完全一致,Go的强类型校验也会判定为类型不匹配,必须使用自动生成的类型调用gRPC接口
修改方案
直接使用protoc生成的Go类型构造请求参数,示例代码如下:
// 导入protoc编译proto文件生成的Go代码对应的包,替换为你实际的包路径 import "your/project/path/proto/gen/pb" // 使用生成的pb.Analytics类型构造切片 analytics := make([]*pb.Analytics, 4) // 此处对analytics切片的元素做业务赋值修改,示例: // analytics[0] = &pb.Analytics{ // 对应字段: 赋值, // } // 封装为接口要求的AnalyticsSet类型 req := &pb.AnalyticsSet{ Analytics: analytics, } // 传入封装好的请求参数调用接口 _, err := c.MyMethod(context.Background(), req) if err != nil { log.Fatalf("error: %s", err) }
补充说明
如果你的业务逻辑必须先使用自定义的Analytics结构体做处理,可以在调用接口前手动做字段拷贝,将自定义结构体的字段值逐一赋值给pb.Analytics的对应字段后再封装为AnalyticsSet即可。
内容的提问来源于stack exchange,提问作者Keval Bhogayata
相关产品推荐
相关产品推荐

