protobuf wiki:

https://github.com/golang/protobuf

1.安装ProtoBuf

下载protoBuf

git clone https://github.com/google/protobuf.git
cd protobuf/

./autogen.sh

./configure

make

sudo make install

成功需要使用protoc -h 测试

2 安装protoc-gen-go插件

它是一个go程序,编译它之后将可执行文件执行路径写入环境变量

go get github.com/golang/protobuf/protoc-gen-go

cd $GOPATH/src/github.com/golang/protubuf/protoc-gen-go/

go build

将生成的protoc-gen-go可执行文件,放在$PATH环境变量中,比如:

export PATH="/home/itcast/workspace/go/src/github.com/golang/protobuf/protoc-gen-go":$PATH

3 获取proto包

go get github.com/golang/protobuf/proto

4.使用protoBuf

protobuf的使用方法是将数据结构写入到.proto文件中,使用protoc编译器编译(间接使用了插件)得到一个新的go包,里面包含go中可以使用的数据结构和一些辅助方法。

(1)编写test.proto文件

  1. 在$GOPATH/src/ 创建 myproto文件夹
  2. 在myproto文件夹中创建test.proto文件(protobuf协议文件)
package myproto;

enum FOO {X = 17;};

message Test {
    required string label = 1;
    optional int32 type = 2 [default=77];
    repeated int64 reps = 3;
    optional group OptionalGroup = 4 {
        required string RequiredFiled = 5;
    }
}

3.编译: 执行

protoc --go_out=. *.proto

生成 test.pb.go 文件

4.使用protobuf做数据格式转换

package main

import (
    "fmt"
    "github.com/golang/protobuf/proto"
    "myproto"
)

func main() {
    test := &myproto.Test{
        Label: proto.String("hello"),
        Type:  proto.Int32(17),
        Reps:  []int64{1, 2, 3},
        Optionalgroup: &myproto.Test_OptionalGroup{
            RequiredFiled: proto.String("good bye"),
        },
    }

    //将Struct test 转换成 protobuf
    data, err := proto.Marshal(test)
    if err != nil {
        fmt.Println("marshaling error: ", err)
    }

    //得到一个新的Test结构体 newTest
    newTest := &myproto.Test{}

    //将protobuf 转换成 Test结构体
    err = proto.Unmarshal(data, newTest)
    if err != nil {
        fmt.Println("unmarshaling error: ", err)
    }

    //将newTest的字符串序列化打出
    fmt.Println(newTest.String())

    //得到type字段
    if test.GetType() != newTest.GetType() {
        fmt.Println("type is not equal")
    }

    //...
}

5.一些对应关系

  • message Test对为 struct 结构,其属性字段有了对应的get方法,在go中可以使用test.GetLabel()test.GetType()获取test对象的属性
  • OptionalGroup对应为 struct中的内嵌struct
  • proto文件中repeated属性对于slice结构
  • test.Reset()可以使其所有属性置为0值
  • 使用Marshal和Unmarshal可以轻松的编码和解码

results matching ""

    No results matching ""