APSchmidt 发表于 2022-8-22 08:26

golang使用protobuf

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:
// New Person info:id:123 age:30 name:"xiaxia" homeAddress:"sh" married:true
页: [1]
查看完整版本: golang使用protobuf