1、protobuf 的安装
1、安装protobuf
GitHub - protocolbuffers/protobuf: Protocol Buffers - Google's data interchange format
如下载protobuf v3.20.1 的版本
下载protobuf https://github.com/protocolbuffers/protobuf/releases/tag/v3.20.1
这里我下载的 protoc-3.20.1-win64.zip
减压并将解压得到的文件中的bin目录路径添加到系统变量中
查看版本
protoc --version
2、protobuf的go语言插件protoc-gen-go插件
go install github.com/golang/protobuf/protoc-gen-go@latest
检查是否安装成功
go env 获取GOPATH的路径,在对应路径查询bin目录是否存在protoc-gen-go.exe
同时检查一下bin目录是否准确配置了环境变量不然也会导致命令没有找到提示
2、protobuf 简单语法
参考文档 (需科学上网) : https://developers.google.com/protocol-buffers/docs/proto3
首先让我们看一个非常简单的例子。
syntax = "proto3"; //指定版本信息,不指定会报错,默认是proto2
option go_package = "./;userinfo"; //分号前面的表示当前.proto文件所在的路径,分号后面表示生成go文件的包名
//message定义一种消息类型,关键字message定义结构,并且结构中可以嵌套定义结构,message定义的内容和生成一个结构体
message userinfo{
// 名字
string username = 1;
// 年龄
int32 age = 2 ;
//爱好
repeated string hobby = 3; // 数组 golang中会生成string类型的切片
}
3、protobuf 基本编译
protobuf编译是通过编译器protoc进行的,通过这个编译器,我们可以把.proto文件生成
go,Java,Python,C++,Ruby,JavaNano, Objective-C,或者C# 代码,生成命令如下:
protoc --proto_path=IMPORT_PATH --go_out=DST_DIR path/to/file.proto
1.--proto_path=IMPORT_PATH,IMPORT_PATH是.proto 文件所在的路径,如果忽略则默认
当前目录。如果有多个目录则可以多次调用--proto_path,它们将会顺序的被访问并执行导入
2.--go_out=DST_DIR,指定了生成的go语言代码文件放入的文件夹
3.允许使用 protoc -go_out=./ *proto 的方式一次性编译多个.proto 文件
4.go语言编译时,protobuf 编译器会把 .proto 文件编译成.pd.go 文件
一般在使用的时候我们都是使用下面这种简单的命令:
protoc --go_out=./ *.proto
编写执行后会在指定目录生成文件
4、protobuf 序列化反序列化
在main.go进行演示
package main
import (
"fmt"
"go-micro/protoc_demo/proto/userService"
"google.golang.org/protobuf/proto"
)
func main() {
fmt.Println("aaa")
u := &userService.Userinfo{
Username: "TGG",
Age: 18,
Hobby: []string{"游泳", "打游戏"},
}
// Protobuf 序列化
data, _ := proto.Marshal(u)
fmt.Println(data)
// Protobuf 反序列化
user := userService.Userinfo{}
proto.Unmarshal(data, &user)
fmt.Printf("%#v", user)
}
在终端执行结果: