当前位置:网站首页>Protobuf Grpc使用异常 类型有未导出的方法,并且是在不同的软件包中定义
Protobuf Grpc使用异常 类型有未导出的方法,并且是在不同的软件包中定义
2022-08-03 18:55:00 【chutianxia】
Grpc使用异常
类型有未导出的方法,并且是在不同的软件包中定义
导致原因:
导出的pb.go 文件中 GretterServer interface中有私有变量导致的。
// GreeterServer is the server API for Greeter service. // All implementations must embed UnimplementedGreeterServer // for forward compatibility type GreeterServer interface { SayHello(context.Context, *HelloRequest) (*HelloReply, error) mustEmbedUnimplementedGreeterServer() }
proto文件内容:
syntax = "proto3"; package helloworld; option go_package = "./helloworld"; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) { } } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }
异常提示:
无法将 ‘&GreeterServer{}’ (类型 *GreeterServer) 用作类型 GreeterServer 类型无法实现 ‘GreeterServer’,因为类型有未导出的方法,并且是在不同的软件包中定义
运行异常:
.\server.go:33:35: cannot use &GreeterServer{} (value of type *GreeterServer) as type helloworld.GreeterServer in argument to pb.RegisterGreeterServer:
*GreeterServer does not implement helloworld.GreeterServer (missing mustEmbedUnimplementedGreeterServer method)protobuf 和 grpc 版本:
google.golang.org/grpc v1.48.0
google.golang.org/protobuf v1.28.0修复方式: 增加第15行代码内容:*pb.UnimplementedXxxxxServer Xxxxx为proto文件中定义的service名称
package main import ( pb "GoRpc/proto/helloworld" "context" "flag" "google.golang.org/grpc" "net" ) var port string type GreeterServer struct { // 增加此行代码 *pb.UnimplementedGreeterServer } func init() { flag.StringVar(&port, "p", "8001", "port to connect to") flag.Parse() } func (s *GreeterServer) SayHello(ctx context.Context, r *pb.HelloRequest) (*pb.HelloReply, error) { return &pb.HelloReply{ Message: "Hello.world"}, nil } func main() { server := grpc.NewServer() pb.RegisterGreeterServer(server, &GreeterServer{ }) lis, _ := net.Listen("tcp", ":"+port) server.Serve(lis) }
修复问题的原因,查看helloworld_grpc.pb.go 文件。 实际SayHello由UnimplementedGreeterServer 结构实现
// GreeterServer is the server API for Greeter service. // All implementations must embed UnimplementedGreeterServer // for forward compatibility type GreeterServer interface { SayHello(context.Context, *HelloRequest) (*HelloReply, error) mustEmbedUnimplementedGreeterServer() } // UnimplementedGreeterServer must be embedded to have forward compatible implementations. type UnimplementedGreeterServer struct { } func (UnimplementedGreeterServer) SayHello(context.Context, *HelloRequest) (*HelloReply, error) { return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented") }
边栏推荐
- B628芯片电路图,B628升压IC的PCB布局PCB
- [Notes] Introduction to machine learning
- [数据集][VOC]老鼠数据集voc格式3001张
- Mock模拟数据,并发起get,post请求(保姆级教程,一定能成功)
- Shell:循环语句
- When does MySQL use table locks and when to use row locks?You should know this
- 在线监控机房内的UPS电源及运行环境,解决方案来了
- Mkke:为什么无法从Oracle 11g或12c升级到Oracle 23c?
- PHP base notes - NO. 1
- vulnhub pyexp: 1
猜你喜欢
随机推荐
pytest接口自动化测试框架 | Jenkins集成初探
Rust:多线程并发编程
openresty 高可用部署
When does MySQL use table locks and when to use row locks?You should know this
基于ck+redash构建MySQL慢日志+审计日志展示平台
Intelligent security contract - delegatecall (2)
Big guy, who is free to help me to see what the problem is, I just read MySQL source print, and I just came into contact with flink.
go语言实现导出string字符串到文件中
机器学习的方法总结
大佬们,flinkcdc 2.2 版本采集sqlserver只能采集到全量的数据,不能采集到增量的数
金鱼哥RHCA回忆录:CL210管理计算资源--管理计算节点+章节实验
系统太多,多账号互通如何实现?
Higher mathematics - chapter ten infinite series - constant term series
Shell:循环语句
MySQL详细学习教程(建议收藏)
【QT】入门心法
2022年7月国产数据库大事记
架构基本概念和架构本质
实现博客营销有哪些技巧
货比四家 version tb1.63