golang Grpc 中出现 it has a non-exported method and is defined in a different package

chaunsin · · 1954 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

首先说一下版本

文档日期:20201021

grpc:v1.32.0

protoc: libprotoc 3.9.0

protoc-gen-go: v1.25.0

protoc-gen-go-grpc:v1.0

ps:查看protoc系列的版本命令终端执行 protoc --version

起因

版本更新,正好闲着没事简单复习一下,意外出现了以下错误

it has a non-exported method and is defined in a different package

正文

先看下定义的proto,红色部分是编译器没有找到proto文件,这并不影响我们本文的问题。


proto文件

通过命令生成文件大概命令如下(如何生成自行百度,不是本文的重点):

protoc -I $gopath/include/googleapis -I . --go_out=. --go-grpc_out=. ./api/login/login.proto

新版生成命令和旧版不一样了,旧命令如下:

protoc -I $gopath/include/googleapis -I . --go_out=plugins=grpc:. ./api/login/login.proto

另外还有一点pb描述和rpc方法之前旧版生成是在一个文件中,目前新版本pb和方法已经分离生成的文件格式特征如下:

红色的文件是通过命令生成的

然后我们看下刚刚生成的login_grpc.pb.go文件,其中一部分代码片段:

OK到这准备工作基本完毕,下面编写代码,实现LoginServer接口如下代码

var _login.LoginServer = &server{} 这句就是判断我们声明server这个结构体是否实现了login.LoginServer接口,很显然它没实现,兜兜转转之后解决方法如下

需要把login.UnimplementedLoginServer 结构体组合(继承)到自己定义的结构体中

ok编译器也没有提示报错。

总结

目前grpc还是在频繁变动更新需要随时留意关注更新,在浏览源代码的时候我们能看到很多代码注释中标注Deprecated:xxx 和 This API is EXPERIMENTAL. 关键字。另外之前跟grpc相关的代码有些已经重命名迁移到新库中,所以有点坑。。。干开发学无止境啊。

完~


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1954 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传