protobuf3使用,golang语言实现

栏目: Go · 发布时间: 6年前

内容简介:下载安装protobuf-3.1.0版本, 把 F:\Program Files\protoc-3.3.0-win32\bin\protoc.exe 文件路径添加到环境变量中。查看是否安装成功,在命令行输入: proto --version安装成功之后,就可以按照protobuf的规则编码和解码任何我们想要传输的数据了。

1.安装protobuf3版本

下载安装protobuf-3.1.0版本, 把 F:\Program Files\protoc-3.3.0-win32\bin\protoc.exe 文件路径添加到环境变量中。

查看是否安装成功,在命令行输入: proto --version

安装成功之后,就可以按照protobuf的规则编码和解码任何我们想要传输的数据了。

比起xml和json形式的数据传输,protobuf拥有更高的数据压缩比和压缩效率。

2.写test.proto文件

相当于给一个对象添加相应的属性。

//指定版本
//注意proto3与proto2的写法有些不同
syntax = "proto3";

//包名,通过protoc生成时 go 文件时
package test;

// 班级
message Class {
    int32 num = 1;
    repeated Student students = 2;
}

// 学生
message Student {
    string name = 1;
    int32 age = 2;
    Sex sex = 3;
}

//性别
enum Sex {
    MAN = 0;
    WOMAN = 1;
}

3.生成文件test.pb.go文件

.proto文件写好之后,不方便我们在代码中使用,需要利用刚才安装的proto工具生成一个我们可以在代码中方便实际调用的类。

这个类生成之后就变成我们和protobuf交换数据的桥梁,我们可以看懂和使用,protobuf也可以识别和解析。

生成test.pb.go文件之后.proto就不需要了,但是为了后期更改和代码可读性继续保留该文件。

test.pb.go具体代码我就不贴出来了,命令如下: protoc --go_out=. *.proto

4.测试和验证

package main

import (
    "github.com/goinaction/learning/proto3-my/test"
    "github.com/gogo/protobuf/proto"
    "io/ioutil"
    "os"
    "log"
)

func write() {
    c1 := &test.Class{
        Num: 1,
        Students: []*test.Student{
            {Name: "xiaoming", Age: 21, Sex: test.Sex_MAN},
            {Name: "xiaohua", Age: 21, Sex: test.Sex_WOMAN},
            {Name: "xiaojin", Age: 21, Sex: test.Sex_MAN},
        },
    }

    // 使用protobuf工具把struct数据类型格式化成字节数组(压缩和编码)
    data, _ := proto.Marshal(c1)

    // 把字节数组写入到文件中
    ioutil.WriteFile("test.txt", data, os.ModePerm)
}

func read() {
    // 以字节数组的形式读取文件内容
    data, _ := ioutil.ReadFile("test.txt")

    class := new(test.Class)

    // 使用protobuf工具把字节数组解码成struct(解码)
    proto.Unmarshal(data, class)

    log.Println(class.Num)
    for _, v := range class.Students {
        log.Println(v.Name, v.Age, v.Sex)
    }
}

func main() {
    write()
    read()
}

代码输出结果:

2018/11/02 16:18:52 1
2018/11/02 16:18:52 xiaoming 21 MAN
2018/11/02 16:18:52 xiaohua 21 WOMAN
2018/11/02 16:18:52 xiaojin 21 MAN

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

你不是个玩意儿

你不是个玩意儿

杰伦·拉尼尔 / 葛仲君 / 中信出版社 / 2011-8 / 35.00元

“你不是个玩意儿。” 这句话当然不是骂人,这是一个宣言。人当然不是玩意儿,不是机器,而是人。 在网络化程度越来越高的今天,我们每个人似乎都有足够的理由,无限欣喜地拥抱互联网。然而,你有没有想过互联网那些不完美的设计却是某种潜在的威胁…… 为什么如此多的暴民在社交网站上争吵不休,很多骂人的脏话我们在现实的人际交往中可能从来不会使用,但在匿名网络环境中却漫天飞舞? 互联网的本质......一起来看看 《你不是个玩意儿》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

随机密码生成器
随机密码生成器

多种字符组合密码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具