一、protobuf的使用分兩步
- 需要使用者在.proto文件中定義消息類型。
- 使用protoc編譯器根據.proto文件生成相應語言的代碼。
二、定義proto消息類型
目前protobuf官方文檔最新是v3版本,我們使用也是v3版本。
https://developers.google.com...
對應的go語言官方教程地址為 https://developers.google.com...
2.1基礎 protobuf 消息類型
我們新建一個 protobuf格式的文件,如下
mkdir pt && cd pt && touch pt.proto
然後把下面的代碼,放到pt.proto裏
syntax = "proto3";
package proto_test;
option go_package = "github.com/hisheng/pb/pt";
message User {
string name = 1;
}
所有的protobuf文件,都是.proto後綴的文件。
syntax = "proto3" 開始代表,下面的protobuf格式是proto3版本的。
每一個文件有一個 package,代表這個文件的命令空間,防止message和別的文件同名帶來的問題。
option go_package 顧名思義,是用來定義go的package的,如果我們的go包項目路徑為
github.com/hisheng/pb,我們可以把pt/pt.proto的 go_package命名為
github.com/hisheng/pb/pt
這個go項目package,可以在我們go代碼裏使用,其他的文件使用的話,可以
import github.com/hisheng/pb/pt
這樣他們就可以使用pt.User這個結構體了。
再然後就是message了,定義類一組字段以及類型,這個會轉化成go對應的結構體。
三、使用protoc生產對應語言的代碼
我們先安裝 protoc 工具,怎麼安裝,可以參考我之前寫的一篇文章
go精通protobuf連載一:安裝protobuf與protoc-gen-go
安裝成功後,我們就可以使用 protoc 來生成對應的編程語言代碼了。
語法如下:
protoc --go_out=$DST_DIR $SRC_DIR/pt.proto
如果有多個proto目錄需要生成,我們可以加上 --proto_path參數
protoc --proto_path=. --go_out=paths=source_relative:. pt.proto
--proto_path 或者 -I 參數用以指定所編譯源碼(包括直接編譯的和被導入的 proto 文件)的搜索路徑
--go_out 指定go語言代碼目錄生成位置。
--go_out=paths=source_relative:.
--go_out=paths=import:.
注意一下 paths 參數,他有兩個選項,import 和 source_relative 。
默認為 import,代表按照生成的 go代碼的包的全路徑去創建目錄層級,
source_relative代表按照 proto 源文件的目錄層級去創建 go 代碼的目錄層級,如果目錄已存在則不用創建。
--go_out 是輸出go類型的文件,其中go_out參數告知protoc編譯器去加載對應的protoc-gen-go工具,然後通過該工具生成go代碼。
$DST_DIR 按照go代碼的包的全路徑去創建目錄層級。
$SRC_DIR proto源文件所在的目錄。
source_relative是使用paths的相對目錄。
3.1 使用go默認的import目錄創建文件
我們proto文件中 對應的代碼為 option go_package = "github.com/hisheng/pb/pt"; 這一行。
我們在pt目錄中使用import目錄創建
protoc --go_out=. pt.proto
生成的pt.pb.go的文件地址為如下,對應我們import的目錄
3.2 使用go相對路徑在proto文件同目錄生成.pb.go文件
protoc --go_out=paths=source_relative:. pt.proto
我們在proto文件的同目錄生成了go文件
我們查看一下 pt.pb.go文件,發現生成了一個 User 結構體,可以供我們使用。