找回密码
 立即注册
查看: 271|回复: 0

golang使用protobuf

[复制链接]
发表于 2022-8-22 08:26 | 显示全部楼层 |阅读模式
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
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-25 05:33 , Processed in 0.090966 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表