protocolbuff是Google推出的开源序列化协议,几乎支持市面上所有主流语言。用作服务器与服务器或者客户端与服务器的网络传输协议再合适不过了。简单写个demo。
项目结构:

ProtocolBuff
    ----Makefile
    ----src
           ----github.com/golang/protobuf
           ----main
           ----protocol

配置协议:
protocol/protocol.proto

package protocol;

enum ItemType
{
        USERITEM  = 1;
        EQUIPMENT = 2;
};
message ItemInfo
{
        optional int32 ID = 1;
        optional int32 Type = 2;
        optional string Name = 3;
        optional int32 Amount = 4;
};

执行protoc --go_out=./ protocol.proto自动生成protocol.pb.go,生成目录为当前目录。protoc支持生成多种语言,具体用protoc -h查看。

main/main.go

package main

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

func main() {
    item := protocol.ItemInfo{
        ID : proto.Int32(10),
        Type : proto.Int32(1),
        Name : proto.String("item_0"),
        Amount: proto.Int32(99),
    }

    data := EncodeMsg(&item)//封包

    fmt.Printf("Encode Data %v \n", data)

    res := DecodeMsg(data)//解包

    fmt.Printf("Decode Data %v \n", res.String())
}

func EncodeMsg(pb proto.Message) []byte{
    data, err := proto.Marshal(pb)
    if err != nil{
        fmt.Errorf("%v \n",err.Error())
    }

    return data
}

func DecodeMsg(data []byte)  (result protocol.ItemInfo){

    proto.Unmarshal(data, &result)

    return
}

Makefile

GOPATH := $(shell pwd)
all:
        GOPATH=${GOPATH} go install main

make以后,bin目录下会生成可执行文件main,执行得到结果:
Encode Data [8 10 16 1 26 6 105 116 101 109 95 48 32 99]
Decode Data ID:10 Type:1 Name:"item_0" Amount:99


Cedrus
363 声望9 粉丝

不积跬步,无以致千里