go语音protobuf_Golang Protobuf

安装 goprotobuf

1.从 https://github.com/google/protobuf/releases获取 Protobuf编译器 protoc(可下载到 Windows下的二进制版本

wgethttps://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gztarzxvfprotobuf-2.6.1.tar.gz

cdprotobuf-2.6.1./configure

make

makeinstall

protoc-h

2.获取 goprotobuf提供的 Protobuf(被放置于 $GOPATH/bin下,$GOPATH/bin应该被加入 PATH环境变量,以便 protoc能够找到 protoc-gen-go)

此插件被protoc 使用,用于编译.proto 文件为Golang 源文件,通过此源文件可以使用定义在.proto 文件中的消息。

gogetgithub.com/golang/protobuf/protoc-gen-go

cdgithub.com/golang/protobuf/protoc-gen-go

gobuild

goinstall

vi/etc/profile将$GOPATH/bin加入环境变量

sourceprofile

3.获取 goprotobuf提供的支持库,包含诸如编码(marshaling)、解码(unmarshaling)等功能

gogetgithub.com/golang/protobuf/proto

cdgithub.com/golang/protobuf/proto

gobuild

goinstall

使用 goprotobuf 1.这里通过一个例子来说明用法。先创建一个 .proto 文件 test.proto:

packageexample;enumFOO{X=17;};

messageTest{

requiredstringlabel=1;

optionalint32type=2[default=77];

repeatedint64reps=3;

optionalgroupOptionalGroup=4{

requiredstringRequiredField=5;

}

}

2.编译此 .proto 文件:

protoc--go_out=.*.proto

这里通过 –go_out 来使用 goprotobuf 提供的 Protobuf

在使用之前,我们先了解一下每个 Protobuf 消息在 Golang 中有哪一些可用的接口:

每一个 Protobuf 消息对应一个 Golang 结构体

消息中域名字为 camel_case 在对应的 Golang 结构体中为 CamelCase

消息对应的 Golang 结构体中不存在 setter 方法,只需要直接对结构体赋值即可,赋值时可能使用到一些辅助函数,例如: msg.Foo=proto.String("hello")

消息对应的 Golang 结构体中存在 getter 方法,用于返回域的值,如果域未设置值,则返回一个默认值

消息中非 repeated 的域都被实现为一个指针,指针为 nil 时表示域未设置

消息中 repeated 的域被实现为 slice

访问枚举值时,使用“枚举类型名_枚举名”的格式(更多内容可以直接阅读生成的源码)

使用 proto.Marshal

3.现在我们编写一个小程序:

packagemain

import("log"

//辅助库

"github.com/golang/protobuf/proto"

//test.pb.go的路径

"example")

funcmain(){//创建一个消息Test

test:=&example.Test{//使用辅助函数设置域的值

Label:proto.String("hello"),Type:proto.Int32(17),Optionalgroup:&example.Test_OptionalGroup{

RequiredField:proto.String("goodbye"),},}//进行编码

data,err:=proto.Marshal(test)iferr!=nil{

log.Fatal("marshalingerror:",err)

}//进行解码

newTest:=&example.Test{}

err=proto.Unmarshal(data,newTest)iferr!=nil{

log.Fatal("unmarshalingerror:",err)

}//测试结果

iftest.GetLabel()!=newTest.GetLabel(){

log.Fatalf("datamismatch%q!=%q",test.GetLabel(),newTest.GetLabel())

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值