博客 / 詳情

返回

go精通protobuf連載三:protobuf使用示例,深入瞭解protoc命令

一、protobuf的使用分兩步

  1. 需要使用者在.proto文件中定義消息類型。
  2. 使用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的目錄
image.png

3.2 使用go相對路徑在proto文件同目錄生成.pb.go文件

protoc --go_out=paths=source_relative:.  pt.proto

我們在proto文件的同目錄生成了go文件
image.png

我們查看一下 pt.pb.go文件,發現生成了一個 User 結構體,可以供我們使用。
image.png

user avatar qinchuan_5d6e16e8918fd 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.