protoc: Command not found

       编译程序报错"protoc: Command not found;*** [xxx.pb.go] Error 127",然后关键字"pb.go"搜到文章<如何在Go中使用Protobuf>,指出需要"1. 安装protoc"和"2. 下载并安装protobuf-go插件"。然后关键字"安装protoc"搜到文章<在 Golang 中使用 Protobuf>,然后依据此标题关键字"go protobuf 安装"搜索到文章<在go语言中安装与使用protobuf的方法详解>,该文章安装protoc十分简洁,但是是2.6版本,安装后编译程序报错`Unrecognized syntax identifier "proto3".  This parser only recognizes "proto2".`,只好执行"make uninstall"然后参照关键字"安装protoc"搜到文章<protobuf 3.1.0 安装示例和使用指南说明>,但是到git网址上下了最新的安装,然后编译程序报错"protoc-gen-go: program not found or is not executable;--go_out: protoc-gen-go: Plugin failed with status code 1.",这个就是前面文章中说到的要安装protoc-gen-go。

       按照文章<在 Golang 中使用 Protobuf>来安装protoc-gen-go,文中说编译后需要执行"go install"来安装,但是安装的位置是在当前目录所在的bin目录下,而该bin目录并没有包含在环境变量中,所以不能用,后面直接拷贝到跟go可执行程序同一个目录下就可以了。文章<在go语言中安装与使用protobuf的方法详解>也指出需要"protoc-gen-go编译它之后将可执行文件执行路径写入环境变量"。

       注意grpc程序,如果在.proto文件中定义的message A中嵌套定义了message B,则在初始化A时,B需要以指针形式来赋值,这个可以参考grpc的examples目录下的route_guide例子,在route_guide.proto文件中定义了几个message,其中Rectangle、RouteNote包含了message Point,所以在client文件中定义这两个变量时,对其Point类型的成员都是用指针来赋值。关于.proto文件中的message,参看了博客园中的文章<Golang gRPC 示例>,"repeated则表示数组"。

原文地址:https://www.cnblogs.com/wongdu2014/p/9175194.html