|
protobuf简称pb,一种流行协议规约,具有序列化/反序列化速度快、压缩率高、语言支持广泛等等特点。
在日常项目开发中,上下游之间只要定义好pb协议,就可以进行协议交互,不要求编程语言相同,协作起来比较方便。
protobuf本身的内容,可参看google的官方文档:Protocol Buffers | Google Developers
第一步 用pb定义一个数据结构,文件保存: blog/pb/test_pb.proto
syntax = "proto3";
package pb; // 定义自己的包名
option go_package = "../pb"; // 指定生成go包的路径
message Person {
int32 id = 1;
int32 age = 2;
string name = 3;
string homeAddress = 4;
bool married = 5;
}第二步 使用工具protoc把proto文件转换为go程序文件
cd blog
protoc --proto_path=pb/ --go_out=pb/ --go_opt=paths=source_relative ./pb/test_pb.proto第三步 编写程序,序列化与反序列化协议数据, blog/main.go
package main
import (
"blog/xia/pb"
"fmt"
"google.golang.org/protobuf/proto"
)
func main() {
// Step 1: marshal struct data
p := &pb.Person{
Id: 123,
Age: 30,
Name: "xiaxia",
HomeAddress: "sh",
Married: true,
}
fmt.Println("Person info: ", p.String())
pbBytes, err := proto.Marshal(p)
if err != nil {
fmt.Println("pb marshal error: ", err.Error())
panic(1)
}
fmt.Println("pb bytes: ", pbBytes)
newP := pb.Person{}
err = proto.Unmarshal(pbBytes, &newP)
if err != nil {
fmt.Println("pb unmarshal error: ", err.Error())
panic(2)
}
fmt.Println("New Person info: ", newP.String())
}
// 运行结果
// go run main.go
// Person info: id:123 age:30 name:"xiaxia" homeAddress:"sh" married:true
// pb bytes: [8 123 16 30 26 6 120 105 97 120 105 97 34 2 115 104 40 1]
// New Person info: id:123 age:30 name:"xiaxia" homeAddress:"sh" married:true |
|