38

protobuf3使用,golang语言实现

 5 years ago
source link: https://studygolang.com/articles/15981?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK