- 1.下载对应zip包, 解压
https://github.com/protocolbuffers/protobuf/releases
-2. 配置环境变量:
在用户系统变量Path最后添加刚刚解压的bin目录,例如: G:\soft\protobuf\bin
-3. 验证是否配置正确:
打开终端,输入protoc,如果输出下面内容,代码配置成功。
-
4.安装protoc-gen-go库
在此之前要设置go的环境变量: -
GO111MODULE=on
-
GOPROXY=https://goproxy.cn,direct
然后:
go get github.com/golang/protobuf/protoc-gen-go -
5.定义test.proto文件, 输入下面数据 :
syntax = "proto3"; //proto版本信息
package test; //定义属于哪个包
//如果报waring就加上这个,不加也能成功
// ./aaa - 表示生成的go文件的存放地址,会自动生成目录的
// test - 表示生成的go文件所属的包名
option go_package = "./aaa;test";
//message是固定格式,表示消息, Order是数据对象的名
// required - 必填项, optional - 选填项, 这两个是proto2的参数,在proto3取消了
// = 1, = 2, = 3是字段的顺序, 为了保证数据顺序的统一
message Order{
int32 order_id = 1;
int64 num = 2;
name = 3;
}
-
6.进入test.proto所在路径, 编译proto文件
.指的是编译后的文件路径, 这里使用当前路径就行,具体路径在proto文件里面定义了
test.proto指要编译的文件
注意 = 后面不能有空格
protoc --go_out =. test.proto -
7.使用上面生成的 test.pb.go文件进行数据封包和拆包
func main(){
fmt.Println("hey_wei_gou")
//创建消息对象
msg_test := &test.Order{
OrderId: *proto.Int32(12),
Num: *proto.Int64(22),
Name: *proto.String("fuck"),
}
//序列化
msgDataEncoding,err := proto.Marshal(msg_test)
if err!=nil{
fmt.Println("err:",err.Error())
panic(err)
return
}
//反序列化
msgEmpty := test.Order{}
err = proto.Unmarshal(msgDataEncoding,&msgEmpty)
if err!=nil{
fmt.Println("err:",err.Error())
panic(err)
return
}
fmt.Println("order_id:",msgEmpty.GetOrderId())
fmt.Println("num:",msgEmpty.GetNum())
fmt.Println("name:",msgEmpty.GetName())
}