protobuf通过定义包含类型结构序列化信息的文件(.proto文件),来编译生成不同语言平台的高效序列化程序代码 根据不同系统下载不同protoc编译器,在windows下下载windows后缀的 把protoc.exe复制到GOPATH/bin目录下 protobuf编译器有支持golang需要安装protoc-gen-go这个go插件 在确保有将GOPATH/bin加入环境变量后,即可在任意目录使用protoc命令 其中,go_out指定编译的go代码输出路径,proto_path指定查找proto文件所在的根目录,最后一个参数是要编译的proto文件名 如果编译出现警告 这是因为默认.proto文件中的包声明生成源代码时作为Go的包名,包名中的. 在Go包名中会转换为_。 一般在proto文件开头使用syntax声明proto版本,默认是proto2 通过import语句导入proto包,比如 protobuf中使用关键字message定义结构,并且结构中可以嵌套定义结构,比如 内嵌类型最终会编译为以外部类型名称_名称作为类型名称的结构体,比如此处,生成的结构体有3个,分别是 基本定义语法如下,其中type是类型,name是字段名称,num是数据编号 最终生成
proto支持通过service与rpc关键字分别定义rpc服务和rpc方法,proto默认不会生成rpc代码,需要结合对应的rpc插件(grpc、twirp等)编译才会生成protoBuf-go学习笔记
protoBuf官方简介
protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法 它可用于(数据)通信协议、数据存储等。 Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法 可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。 你可以定义数据的结构,然后使用特殊生成的源代码 轻松的在各种数据流中使用各种语言进行编写和读取结构数据。 你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。
下载protoBuf编译器
protoc-3.12.0-rc-1-winxxx.zip
解压后得到的目录中,bin目录中的protoc.exe就是编译protoc代码命令Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2020/5/5 1:24 bin d----- 2020/5/5 1:24 include -a---- 2020/5/5 1:24 724 readme.txt
安装go专属plugin
通过下载源码编译后,把编译出的exe重命名为protoc-gen-go.exe放到GOPATH/bin下
github.com/golang/protobufcd protoc-gen-go go build main.go
编译proto到go代码
protoc --go_out=. --proto_path=. *.proto
最终旧生成了代码文件xxx.pb.goproto包名
Missing 'go_package' option in "test.proto"
比如proto包名a.b将会变为Go包名a_b,所以一般通过option go_package指令来指定Go包名
比如如下代码指定了go包名为a.b(不管是否定义了proto包名)option go_package = "a.b";
syntax声明
比如syntax = "proto3";
导入包
import "google/protobuf/struct.proto"
定义message
message A {} message B { message C { } }
type A struct {...} type B struct {...} type B_C struct {...}
定义字段
当反序列化时,会把对应数据编号对应的数据填充到对应字段
对于type,如果是message类型,在编译为语言代码时会被转化为对应的指针类型type name = num
message A { string name = 1; }
message B { string name = 1; } message A { B b = 1; }
message A { map<string,int> pic = 1; }
枚举类型会被编译为整型的替代类型,枚举值会变为const变量,以类型名_枚举量名作为名称
与message类似,枚举也可以嵌套在类型中,最终会编译为以外部类型名称_枚举名称作为类型名称
比较独特的,枚举枚举中枚举量的数值就是他们编译后代码中常量的初始化数值,第一个枚举量的数据编号必须是0
message A{ enum Color{ RED = 0; BLACK = 1; } Color c = 1; } enum Day{ ONE = 0; TWO = 1; }
通过在类型前加上关键字repeated代表其为数组类型,该字段序列化可能出现0次或多次,比如
message B{} message A{ repeated B bs= 1; }
type B struct {...} type A struct { ... Bs []*B ... }
定义服务
比如如下代码,定义了一个service,提供一个search的rpc调用方法,接收一个Request类型的参数,返回Response类型的结果message Request{} message Response{} service Search{ rpc search(Request) returns(Response); }
golang使用proto
google.golang.org/protobuf/
google.golang.org/protobuf/proto
//A is message a := A{} bis, _ := proto.Marshal(&a) fmt.Printf("%vn", bis) var r A proto.Unmarshal(bis, &r) fmt.Printf("%vn", r)
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算