0.0 背景

把 HiMagpie 推送服务的各模块数据交互从 json 替换成 pb.

1.0 安装 Protobuf 编译器 protoc

把 /usr/local/pb/bin 加到 $PATH 环境变量

  • sudo vi /etc/profile

  • 添加 export PATH=$PATH:/usr/local/pb/bin

  • 保存,并执行: source /etc/profile

2.0 获取 Protobuf 编译器插件 protoc-gen-go,以支持生成 Golang 的 pb 源文件

在 pb 的 bin 目录中会生成 protoc-gen-go 二进制文件

3.0 测试

3.1 新建 *.proto 文件

在刚刚新建的 pb 项目下,新建目录: src/app/protos, 然后在 protos 包目录下新建 example.proto 文件。

example.proto 内容:

package protos;

enum FOO {
    X = 17;
};

message Example {
    required string label = 1;
    optional int32 type = 2 [default=77];
    repeated int64 reps = 3;
    optional group OptionalGroup = 4 {
        required string RequiredField = 5;
    }
}
3.2 使用 protoc 解析 .proto 文件,生成对应的 .go 文件

进入 src/app/protos 目录, 编译 *.proto

protoc --go_out=. example.proto
备注:也可以使用 protoc --go_out=. *.proto 编译所有 *.proto 文件

编译成功,会在当前目录看到 example.pb.go 的 Golang 文件,可用于开发使用。

4.1 测试实例

src/app 目录下新建 main.go 文件, 内容:

package main

import (
    "app/protos"
    "github.com/golang/protobuf/proto"
    "log"
    "os"
    "fmt"
)

func main() {
    exam := &protos.Example{
        Label: proto.String("Hello, ProtoBuffer."),
        Type: proto.Int32(17),
        Optionalgroup:&protos.Example_OptionalGroup{
            RequiredField:proto.String("Opitonalgroup"),
        },
    }

    data, err := proto.Marshal(exam)
    if err != nil {
        log.Fatal("Marshaling pb err: ", err)
        os.Exit(-1)
    }

    newExam := &protos.Example{}
    err = proto.Unmarshal(data, newExam)
    if err != nil {
        log.Fatal("Unmarshling err: ", err)
        os.Exit(-1)
    }

    if exam.GetLabel() != newExam.GetLabel() {
        log.Fatalf("data mismatch %q != %q", exam.GetLabel(), newExam.GetLabel())
        os.Exit(-1)
    }

    fmt.Println("OK! ", newExam.GetLabel())
}

输出结果:

OK! Hello, ProtoBuffer.