重装Ubuntu后protoc-gen-go编译proto文件报错及代码兼容问题求助
解决protoc-gen-go编译gRPC代码报错及兼容性问题
问题原因
新版protoc-gen-go(v1.20及以上版本)移除了对plugins=grpc参数的支持,将gRPC代码生成功能拆分到了独立的protoc-gen-go-grpc工具中,因此旧编译命令会触发报错。
解决方案
方案1:回退到兼容旧命令的版本
如果需要完全兼容旧代码,直接安装仍支持plugins=grpc参数的旧版protoc-gen-go:
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.19.5
安装完成后,继续使用你原来的编译命令即可:
protoc -I . myfile.proto --go_out=plugins=grpc:protofiles
方案2:升级适配新工具链
若想使用新版工具,需分两步生成代码,同时调整业务代码适配细微差异:
- 安装
protoc-gen-go-grpc工具:
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
- 分别执行两条命令生成基础proto代码和gRPC代码:
# 生成基础PB代码 protoc -I . myfile.proto --go_out=protofiles # 生成gRPC代码(添加参数避免强制实现未使用的方法) protoc -I . myfile.proto --go-grpc_out=require_unimplemented_servers=false:protofiles
- 代码适配:
新版生成的代码会包含UnimplementedXXXServer空结构体,你只需让自己的服务结构体嵌入该结构体,即可兼容原有业务逻辑,示例:
// 你的服务结构体 type MyGreeterServer struct { pb.UnimplementedGreeterServer // 嵌入空结构体,无需实现所有方法 } // 实现你需要的方法 func (s *MyGreeterServer) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) { // 业务逻辑 return &pb.HelloReply{Message: "Hello " + req.Name}, nil }
内容的提问来源于stack exchange,提问作者xmm_581
相关产品推荐
相关产品推荐

