golang与protobuf整合

文章来源   https://www.jianshu.com/p/d189b205ae7e


安装

在go中使用protobuf,有两个可选用的包goprotobuf(go官方出品)和gogoprotobuf。

gogoprotobuf完全兼容google protobuf,它生成的代码质量和编解码性能均比goprotobuf高一些

安装protoc

首先去下载protobuf的编译器protoc,windows上可以直接下到exe文件(linux则需要编译),最后将下载好的可执行文件拷贝到GOPATH的bin目录下(GOPATH/bin目录最好添加到系统环境变量里)

安装protobuf库文件

gogetgithub.com/golang/protobuf/proto

goprotobuf

安装插件

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

实例demo

/指定版本// 不同版本写法存在差异syntax="proto3";// 包名,通过protoc生成go文件时packagetest;// 手机类型// 指定字段顺序 第一个必须为0enum PhoneType{HOME=0;WORK=1;}// 手机message Phone{PhoneTypetype=1;stringnumber=2;}// 人message Person{int32id=1;stringname=2;// repeated表示重复repeated Phone phones=3;}message ContactBook{repeated Person persons=1;}

生成go文件

protoc --go_out=.  *.proto

生成后的文件:

// Code generated by protoc-gen-go. DO NOT EDIT.// source: test.proto// 包名,通过protoc生成go文件时packagetestprotobufimport(fmt"fmt"proto"github.com/golang/protobuf/proto"math"math")// Reference imports to suppress errors if they are not otherwise used.var_=proto.Marshalvar_=fmt.Errorfvar_=math.Inf// This is a compile-time assertion to ensure that this generated file// is compatible with the proto package it is being compiled against.// A compilation error at this line likely means your copy of the// proto package needs to be updated.const_=proto.ProtoPackageIsVersion3// please upgrade the proto package// 手机类型// 指定字段顺序 第一个必须为0typePhoneTypeint32const(PhoneType_HOME PhoneType=0PhoneType_WORK PhoneType=1)varPhoneType_name=map[int32]string{0:"HOME",1:"WORK",}varPhoneType_value=map[string]int32{"HOME":0,"WORK":1,}func(x PhoneType)String()string{returnproto.EnumName(PhoneType_name,int32(x))}func(PhoneType)EnumDescriptor()([]byte,[]int){returnfileDescriptor_c161fcfdc0c3ff1e,[]int{0}}// 手机typePhonestruct{Type                PhoneType`protobuf:"varint,1,opt,name=type,proto3,enum=testprotobuf.PhoneType" json:"type,omitempty"`Numberstring`protobuf:"bytes,2,opt,name=number,proto3" json:"number,omitempty"`XXX_NoUnkeyedLiteralstruct{}`json:"-"`XXX_unrecognized[]byte`json:"-"`XXX_sizecacheint32`json:"-"`}func(m*Phone)Reset(){*m=Phone{}}func(m*Phone)String()string{returnproto.CompactTextString(m)}func(*Phone)ProtoMessage(){}func(*Phone)Descriptor()([]byte,[]int){returnfileDescriptor_c161fcfdc0c3ff1e,[]int{0}}func(m*Phone)XXX_Unmarshal(b[]byte)error{returnxxx_messageInfo_Phone.Unmarshal(m,b)}func(m*Phone)XXX_Marshal(b[]byte,deterministicbool)([]byte,error){returnxxx_messageInfo_Phone.Marshal(b,m,deterministic)}func(m*Phone)XXX_Merge(src proto.Message){xxx_messageInfo_Phone.Merge(m,src)}func(m*Phone)XXX_Size()int{returnxxx_messageInfo_Phone.Size(m)}func(m*Phone)XXX_DiscardUnknown(){xxx_messageInfo_Phone.DiscardUnknown(m)}varxxx_messageInfo_Phone proto.InternalMessageInfofunc(m*Phone)GetType()PhoneType{ifm!=nil{returnm.Type}returnPhoneType_HOME}func(m*Phone)GetNumber()string{ifm!=nil{returnm.Number}return""}// 人typePersonstruct{Idint32`protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`Namestring`protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`// repeated表示重复Phones[]*Phone`protobuf:"bytes,3,rep,name=phones,proto3" json:"phones,omitempty"`XXX_NoUnkeyedLiteralstruct{}`json:"-"`XXX_unrecognized[]byte`json:"-"`XXX_sizecacheint32`json:"-"`}func(m*Person)Reset(){*m=Person{}}func(m*Person)String()string{returnproto.CompactTextString(m)}func(*Person)ProtoMessage(){}func(*Person)Descriptor()([]byte,[]int){returnfileDescriptor_c161fcfdc0c3ff1e,[]int{1}}func(m*Person)XXX_Unmarshal(b[]byte)error{returnxxx_messageInfo_Person.Unmarshal(m,b)}func(m*Person)XXX_Marshal(b[]byte,deterministicbool)([]byte,error){returnxxx_messageInfo_Person.Marshal(b,m,deterministic)}func(m*Person)XXX_Merge(src proto.Message){xxx_messageInfo_Person.Merge(m,src)}func(m*Person)XXX_Size()int{returnxxx_messageInfo_Person.Size(m)}func(m*Person)XXX_DiscardUnknown(){xxx_messageInfo_Person.DiscardUnknown(m)}varxxx_messageInfo_Person proto.InternalMessageInfofunc(m*Person)GetId()int32{ifm!=nil{returnm.Id}return0}func(m*Person)GetName()string{ifm!=nil{returnm.Name}return""}func(m*Person)GetPhones()[]*Phone{ifm!=nil{returnm.Phones}returnnil}typeContactBookstruct{Persons[]*Person`protobuf:"bytes,1,rep,name=persons,proto3" json:"persons,omitempty"`XXX_NoUnkeyedLiteralstruct{}`json:"-"`XXX_unrecognized[]byte`json:"-"`XXX_sizecacheint32`json:"-"`}func(m*ContactBook)Reset(){*m=ContactBook{}}func(m*ContactBook)String()string{returnproto.CompactTextString(m)}func(*ContactBook)ProtoMessage(){}func(*ContactBook)Descriptor()([]byte,[]int){returnfileDescriptor_c161fcfdc0c3ff1e,[]int{2}}func(m*ContactBook)XXX_Unmarshal(b[]byte)error{returnxxx_messageInfo_ContactBook.Unmarshal(m,b)}func(m*ContactBook)XXX_Marshal(b[]byte,deterministicbool)([]byte,error){returnxxx_messageInfo_ContactBook.Marshal(b,m,deterministic)}func(m*ContactBook)XXX_Merge(src proto.Message){xxx_messageInfo_ContactBook.Merge(m,src)}func(m*ContactBook)XXX_Size()int{returnxxx_messageInfo_ContactBook.Size(m)}func(m*ContactBook)XXX_DiscardUnknown(){xxx_messageInfo_ContactBook.DiscardUnknown(m)}varxxx_messageInfo_ContactBook proto.InternalMessageInfofunc(m*ContactBook)GetPersons()[]*Person{ifm!=nil{returnm.Persons}returnnil}funcinit(){proto.RegisterEnum("testprotobuf.PhoneType",PhoneType_name,PhoneType_value)proto.RegisterType((*Phone)(nil),"testprotobuf.Phone")proto.RegisterType((*Person)(nil),"testprotobuf.Person")proto.RegisterType((*ContactBook)(nil),"testprotobuf.ContactBook")}funcinit(){proto.RegisterFile("test.proto",fileDescriptor_c161fcfdc0c3ff1e)}varfileDescriptor_c161fcfdc0c3ff1e=[]byte{// 221 bytes of a gzipped FileDescriptorProto0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x6c,0x8f,0x41,0x4b,0xc4,0x30,0x10,0x85,0x4d,0xb7,0x1b,0xdd,0x59,0x59,0x96,0x51,0x34,0x37,0x4b,0x4f,0xc5,0x42,0x0e,0xf5,0xec,0x45,0x11,0x04,0x95,0x96,0x20,0x88,0xc7,0xd6,0x46,0x2c,0xd2,0x24,0x34,0xe9,0xa1,0xff,0x5e,0x3a,0x54,0x11,0xf1,0xf6,0x85,0x7c,0xef,0x3d,0x06,0x20,0x68,0x1f,0xa4,0x1b,0x6c,0xb0,0x78,0x3c,0x33,0x61,0x33,0xbe,0xa7,0x8f,0xb0,0xae,0x3e,0xac,0xd1,0x98,0x43,0x1c,0x26,0xa7,0x05,0x4b,0x58,0xb6,0x2b,0xce,0xe5,0x6f,0x4b,0x92,0xf2,0x3c,0x39,0xad,0x48,0xc2,0x33,0xe0,0x66,0xec,0x1b,0x3d,0x88,0x28,0x61,0xd9,0x46,0x2d,0xaf,0xf4,0x15,0x78,0xa5,0x07,0x6f,0x0d,0xee,0x20,0xea,0x5a,0x2a,0x5b,0xab,0xa8,0x6b,0x11,0x21,0x36,0x75,0xaf,0x17,0x9f,0x18,0x73,0xe0,0x6e,0x2e,0xf6,0x62,0x95,0xac,0xb2,0x6d,0x71,0xf2,0xcf,0xa8,0x5a,0x94,0xf4,0x1a,0xb6,0xb7,0xd6,0x84,0xfa,0x2d,0xdc,0x58,0xfb,0x89,0x12,0x0e,0x1d,0x2d,0x79,0xc1,0x28,0x7c,0xfa,0x27,0x4c,0x9f,0xea,0x5b,0xba,0xbc,0x80,0xcd,0xcf,0x11,0x78,0x04,0xf1,0x7d,0xf9,0x74,0xb7,0x3f,0x98,0xe9,0xa5,0x54,0x0f,0x7b,0xd6,0x70,0x8a,0x5e,0x7d,0x05,0x00,0x00,0xff,0xff,0xa4,0x04,0x76,0xab,0x2b,0x01,0x00,0x00,}

作者:神奇的考拉

链接:https://www.jianshu.com/p/d189b205ae7e

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 安装 在go中使用protobuf,有两个可选用的包goprotobuf(go官方出品)和gogoprotobuf...
    神奇的考拉阅读 2,646评论 0 0
  • 相关知识可以参考Cocos Creator Protobuf的js版本使用protoc2 与 protoc3 区别...
    合肥黑阅读 10,746评论 0 1
  • protobuf的诞生 以前在不同系统或者不同项目之间传输数据主要使用XML格式。下面是xml格式的一些优缺点。 ...
    初级赛亚人阅读 4,395评论 0 1
  • 山庄情怀 叔父今年85岁,在我们人老几辈中算是高寿了。二十年前,我就思考这样一个问题:在我们家族史中...
    耿平海阅读 4,603评论 69 107
  • 姓名 冯二龙 企业名称 宁波惠康国际工业有限公司 组别 444期 努力一组 【日精进打卡第279天】 【知~学习】...
    冯二龙阅读 111评论 0 0