• Golang语言下使用Protocol Buffer教程


    代码仓库地址

     一、介绍

    Protobuf是Google旗下的一款平台无关,语言无关,可扩展的序列化结构数据格式。所以很适合用做数据存储和作为不同应用,不同语言之间相互通信的数据交换格式,只要实现相同的协议格式即同一proto文件被编译成不同的语言版本,加入到各自的工程中去,这样不同语言就可以解析其他语言通过Protobuf序列化的数据。目前官网提供了C++,Python,JAVA,GO等语言的支持。

    相对于JSON和XML具有以下优点:

    • 简洁

    • 体积小:消息大小只需要XML的1/10 ~ 1⁄3

    • 速度快:解析速度比XML快20 ~ 100倍

    • 使用Protobuf的编译器,可以生成更容易在编程中使用的数据访问代码

    • 更好的兼容性,Protobuf设计的一个原则就是要能够很好的支持向下或向上兼容

     
    注:本文主要注重protobuf的使用,所以省去了下载、安装的操作步骤。
     
     

    二、创建一个test.proto文件并生成test.pb.go文件

    syntax = "proto3";  //声明使用proto3协议
    
    package test;  //包名,通过protoc生成go文件
    
    enum PhoneType{
        HOME = 0;
        WORK = 1;
    }
    
    message Phone{  //消息定义的关键字
        PhoneType type = 1;
        string number = 2;
    }
    
    message Person{
        int32 id = 1;
        string name = 2;
        repeated Phone phones = 3;  //字段可以被重复任意多次(包括0次)
    }
    
    message ContactBook{
        repeated Person persons = 1;
    }

    运行如下命令生成test.pb.go文件

    > protoc --go_out=. *.proto

    注意 包名要和文件夹名一致。

    三、在Go语言中使用Protobuf

    package main
    
    import (
        "fmt"
        "io/ioutil"
        "os"
        "pftest/pf"
    
        "pftest/github.com/golang/protobuf/proto"
    )
    
    func write() {
        p1 := &pf.Person{
            Id:   1,
            Name: "小张",
            Phones: []*pf.Phone{
                {pf.PhoneType_HOME, "11111111"},
                {pf.PhoneType_WORK, "22222222"},
            },
        }
    
        p2 := &pf.Person{
            Id:   2,
            Name: "小王",
            Phones: []*pf.Phone{
                {pf.PhoneType_HOME, "33333333"},
                {pf.PhoneType_WORK, "44444444"},
            },
        }
    
        p3 := &pf.Person{
            Id:   3,
            Name: "小李",
            Phones: []*pf.Phone{
                {pf.PhoneType_HOME,"55555555"},
                {pf.PhoneType_WORK,"66666666"},
            },
        }
    
        book := &pf.ContactBook{}
        book.Persons = append(book.Persons, p1)
        book.Persons = append(book.Persons, p2)
        book.Persons = append(book.Persons, p3)
    
        data, _ := proto.Marshal(book)
    
        ioutil.WriteFile("./test.txt", data, os.ModePerm)
    }
    
    func read() {
        date, _ := ioutil.ReadFile("./test.txt")
        book := &pf.ContactBook{}
    
        proto.Unmarshal(date, book)
        for _, v := range book.Persons {
            fmt.Println(v.Id, v.Name)
            for _, vv := range v.Phones {
                fmt.Println(vv.Type, vv.Number)
            }
        }
    }
    
    func main() {
        write()
        read()
    }

    运行结果如下:

    四、参考资料

    Protobuf简介和使用

    [转]Protobuf3 语法指南_鸟窝

    Golang版protobuf的安装与使用

     

    五、小结

    如果有兴趣想了解数据的操作,压缩的全过程,可以考虑使用Protobuf。

    它就像一个代码转换器,你只需写好底层协议,然后用Protobuf现成的工具生成对应语言的源文件,从而达到项目中使用相同协议格式进行数据传输的目的。

    这是我在工作中学习到的一个新技巧!

     

     

  • 相关阅读:
    VS头部自动注释
    JSONP跨域实现
    Chosen:Select 选择框的华丽变身
    Android NFC 整理
    Android Activity生命周期(转)
    eclipse svn 相关
    初学Java web(转)
    Java 定时任务(转)
    声音
    (转)关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究
  • 原文地址:https://www.cnblogs.com/OctoptusLian/p/9471255.html
Copyright © 2020-2023  润新知