golang-protobuf配置和使用

-2. 配置环境变量:
在用户系统变量Path最后添加刚刚解压的bin目录,例如: G:\soft\protobuf\bin

-3. 验证是否配置正确:
打开终端,输入protoc,如果输出下面内容,代码配置成功。
golang-protobuf配置和使用

  • 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())
}
上一篇:protobuf和flask结合高效数据传输


下一篇:神级Java进阶笔记!常见的序列化框架及Protobuf原理