編譯程序報錯"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則表示數組"。