go Protobuf安装使用
starine 人气:9引言
本文记录了mac环境下protobuf的编译安装,并通过一个示例来演示proto自动生成go代码。
本文使用的mac os 12.3系统,不建议使用homebrew安装,系统版本太高,会安装报错,所以自己下载新版压缩包编译构建安装。
1、安装protobuf编译器
在 官方github 选择适合自己系统的Proto编译器程序进行下载安装
本文使用的mac os 12.3系统,不建议使用homebrew安装,系统版本太高,会报错,所以自己下载压缩包构建安装。
- 下载地址:链接: http://pan.baidu.com/s/1NIMErRKrP3-DNmvA8SgKxg 提取码: 27av
如需压缩包请在评论区留言。
2.在/usr/local/下新建文件夹protobuf
3.将下载文件拷贝到:/usr/local/protobuf/
4.配置环境变量:
vim ~/.bash_profile
增加:
# protobuf export PROTOBUF=/usr/local/protobuf export PATH=$PROTOBUF/bin:$PATH
使环境变量生效:
source ~/.bash_profile
解压:
tar zxvf protobuf-all-3.20.1.tar.gz
cd 进入 protobuf-3.20.1/目录下,在终端按顺序执行:
sudo ./configure sudo make sudo make check sudo make install
执行命令:protoc --version
检查是否安装成功
2、下载protobuf的golang支持库,安装protoc-gen-go
protoc-gen-go
用来将 .proto
文件转换为 Golang 代码。
在终端运行命令:
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
这条命令会安装,并将protoc-gen-go
可执行文件复制到$GOBIN
文件夹下
注意:原来的github.com/golang/protobuf/protoc-gen-go
这个库已经被弃用,我们需要使用 google.golang.org/protobuf
这个库
% go get -u github.com/golang/protobuf/protoc-gen-go go: module github.com/golang/protobuf is deprecated: Use the "google.golang.org/protobuf" module instead. go: added github.com/golang/protobuf v1.5.2 go: added google.golang.org/protobuf v1.28.0
3、protobuf使用示例
1、新建一个go moudle项目,创建扩展名为.proto
的文件,并编写代码。比如创建idl/user.proto文件,内容如下:
syntax = "proto3"; package user; option go_package ="./user"; message User { int64 user_id = 1; string user_name = 2; string password = 3; }
2、编译.proto文件,生成Go语言文件。执行如下命令:
protoc --go_out=. ./idl/*.proto
将会自动生成对应的user目录,存放生成的user.pb.go文件:
3、在main程序中使用Protobuf生成的代码:
使用proto将user序列化输出out,在将out反序列化成user
package main import ( "encoding/json" "fmt" "github.com/starine/go-protoc-example/user" "google.golang.org/protobuf/proto" "log" ) func main() { fmt.Println("Hello World. \n") user1 := user.User{} user1.Password = "123456" user1.UserName = "starine" bytes, _ := json.Marshal(user1) fmt.Println(string(bytes)) //序列化user结构体数据 out, err := proto.Marshal(&user1) if err != nil { log.Fatalln("Failed to encode User:", err) } fmt.Println(out) //反序列化user结构体 user2 := user.User{} err = proto.Unmarshal(out, &user2) if err!=nil { log.Fatalln("Failed to parse User:", err) } bytes, _ = json.Marshal(user2) fmt.Println(string(bytes)) }
运行结果:
% go run main.go
Hello World.{"user_name":"starine","password":"123456"}
[18 7 115 116 97 114 105 110 101 26 6 49 50 51 52 53 54]
{"user_name":"starine","password":"123456"}Process finished with the exit code 0
加载全部内容