一、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


海生
104 声望33 粉丝

与黑夜里,追求那一抹萤火。