当前位置: 首页 > news >正文

济南网站建设的公司移动网站开发入门

济南网站建设的公司,移动网站开发入门,公众平台网站建设哪家专业,加强司法机关网站建设文章目录 一、介绍二、安装三、protoc3语法1、 protoc3 与 protoc2区别2、proto3生成go代码包Message内嵌Message字段单一标量字段单一message字段可重复字段slicemap字段枚举 一、介绍 Protobuf是Google旗下的一款平台无关#xff0c;语言无关#xff0c;可扩展的序列化结构… 文章目录 一、介绍二、安装三、protoc3语法1、 protoc3 与 protoc2区别2、proto3生成go代码包Message内嵌Message字段单一标量字段单一message字段可重复字段slicemap字段枚举 一、介绍 Protobuf是Google旗下的一款平台无关语言无关可扩展的序列化结构数据格式。所以很适合用做数据存储和作为不同应用不同语言之间相互通信的数据交换格式只要实现相同的协议格式即同一proto文件被编译成不同的语言版本加入到各自的工程中去这样不同语言就可以解析其他语言通过Protobuf序列化的数据。目前官网提供了C,Python,JAVA,GO等语言的支持。 二、安装 Mac上安装Protoc3Windows安装Protoc3可以查看本人的另一篇博客windows安装protoc、protoc-gen-go、protoc-gen-go-grpc安装protoc-gen-go protoc-gen-go是生成Go代码的protocolbuffers编译器。可以理解为一个编译器插件配合protoc来使用。在命令行执行如下命令即可完成安装 go get -u github.com/golang/protobuf/protoc-gen-golatest网上资料推荐的基本都是这个命令但目前该模块已被弃用继续使用该命令将出现错误,提示该库已经被弃用让我们使用go get -u google.golang.org/protobuf/ protoc-gen-go二进制文件当编译器调用时传递了 --go_out命令行标志时 protoc就会使用它。--go_out告诉编译器把生成的Go源代码写到哪里。编译器会为每个 .proto文件生成一个单独的源代码文件。 输出文件的名称是通过获取.proto文件的名称并进行两处更改来计算的 生成文件的扩展名是 .pb.go。比如说 player_record.proto编译后会得到 player_record.pb.go。 使用 --proto_path或 -I命令行标志指定proto文件所在路径使用 --go_out标志指定生成的go文件放在哪个路径下。 当你运行如下编译命令时 protoc --proto_pathsrc --go_outbuild/gen src/foo.proto src/bar/baz.proto编译器会读取文件 src目录下的src/foo.proto和 src/bar/baz.proto这将会在build/gen目录下生成两个输出文件 build/gen/foo.pb.go和 build/gen/bar/baz.pb.go 如果有必要编译器会自动生成 build/gen/bar目录其中bar为我们在proto文件中指定的go文件包名如option go_package /bar;但是他不能创建 build或者 build/gen目录这两个必须是已经存在的目录。 三、protoc3语法 1、 protoc3 与 protoc2区别 proto3在proto2的基础上去掉了一些复杂的语法和特性更强调约定而弱化语法。主要几点区别如下 proto文件第一行非空白非注释行必须指定版本syntax proto3;如果不指定则默认是proto2字段规则移除了 required并把 optional改名为 singular省略不写时默认就是singular。repeated字段默认采用 packed 编码在 proto2 中需要明确使用[packedtrue] 来为字段指定比较紧凑的 packed 编码方式。语言增加 Go、Ruby、JavaNano 支持即在proto2时并不支持go语言。移除了default 选项在proto2中可以使用default选项为某一字段指定默认值。在 proto3 中字段的默认值只能根据字段类型由系统决定。也就是说默认值全部是约定好的而不再提供指定默认值的语法。在字段被设置为默认值的时候该字段不会被序列化。这样可以节省空间提高效率。 但这样就无法区分某字段是根本没赋值还是赋值了默认值。 所以一般需要避免将默认值作为任何行为的触发方式。例如 enum AudienceDisplayTypeEnum {NoValue 0; // 占位符说明端上没有传入此参数请勿使用CurrentCount 1; // 展示当前直播间内人数AccumulativeCount 2; // 展示直播间累计人数SettingEntranceClosed 99; // 端上拿到则不展示此选项相当于配置项是否出现的开关 }此例子是控制直播间展示在线人数还是看播人次的开关开关仅两个取值true和false但这里并没有使用bool类型因为bool型默认值是false,即使前端没有给我们传该值我们也会拿到false值从而可能当成是前端传过来的值切换开关因此使用枚举。使用枚举后不使用0和1表示开关的打开与关闭因为0是枚举的默认值也不应该作为控制行为的值,因此有业务含义的从序号为1的字段开始。 6. 枚举类型的第一个字段必须为 0,因为枚举会把第一个字段作为默认值 7. 增加了JSON映射特性,如 message XXXRequest {string name 1; int64 begin_time 2 (go.tag json:\beginTime\);int64 end_time 3;int32 page_no 4;int32 page_size 5; }2、proto3生成go代码 Go Proto Buffer代码生成官网文档地址 包 如果一个.proto文件中有包声明生成的源代码将会使用它来作为Go的包名如果.proto的包名中有. 在Go包名中会将.转换为_。举例来说proto包名example.high_score将会生成Go包名example_high_score。 在.proto文件中可以使用option go_package指令来覆盖上面默认生成Go包名的规则。比如说包含如下指令的一个.proto文件 package example.high_score; option go_package /test;生成的Go源代码的包名是test。 如果一个.proto文件中不包含package声明生成的源代码将会使用.proto文件的文件名作为Go包名.会被首先转换为_。举例来说一个名为high.score.proto不包含package声明的文件将会生成文件high.score.pb.go他的Go包名是high_score。 Message 一个简单的message声明 message Foo {}protocol buffer编译器将会生成一个名为Foo的结构体var A *Foo为实现了proto.Message接口的Foo类型的指针因为Foo实现了proto.Message接口中ProtoMessage()方法生成的XXX.pb.go文件将包含如下代码片段注意看注释哦 type Foo struct { }// 重置proto为默认值 func (m *Foo) Reset() { *m Foo{} }// String 返回proto的字符串表示 func (m *Foo) String() string { return proto.CompactTextString(m) }// ProtoMessage作为一个tag 确保其他人不会意外的实现 // proto.Message 接口. func (*Foo) ProtoMessage() {}内嵌Message 一个message可以声明在其他message的内部。比如 message Foo {message Bar {} }这种情况编译器会生成两个结构体Foo和Foo_Bar。 字段 编译器会为每个在message中定义的字段生成一个Go结构体的字段字段的确切性质取决于它的类型以及它是singularrepeatedmap还是oneof字段。 注意生成的Go结构体的字段将始终使用驼峰命名即在.proto文件中消息字段用的是小写加下划线工作中基本都是这种形式生成的Go代码会是大驼峰命名。大小写转换的原理如下 首字母会大写如果message中字段的第一个字符是_它将被替换为X。如果内部下划线后跟小写字母则删除下划线并将后面跟随的字母大写。 因此proto字段foo_bar_baz在Go中变成FooBarBaz _my_field_name变为XMyFieldName。 单一标量字段 对于包级别字段定义 int32 id 1;编译器将生成一个带有名为Id的int32字段和一个访问器方法GetId()的结构该方法返回结构体中Id字段的零值如果字段未设置数值型零值为0字符串为空字符串。 单一message字段 给出如下消息类型 message Bar {}对于一个有Bar类型字段的消息 // proto3 message Baz {Bar foo 1; }编译器将会生成一个Go结构体 type Baz struct {Foo *Bar }消息类型的字段可以设置为nil这意味着该字段未设置。 编译器还生成一个funcm *BazGetFoo() *Bar辅助函数。这让不在中间检查nil值进行链式调用成为可能,因为该方法中会进行相关字段的nil判断。 可重复字段slice 每个重复的字段在Go中的结构中生成一个T类型的slice其中T是字段的元素类型。对于带有重复字段的消息 message Baz {repeated Bar foo 1; }编译器会生成如下结构体 type Baz struct {Foo []*Bar }同样对于字段定义repeated bytes foo 1; 编译器将会生成一个带有类型为[][]byte, 名为Foo的字段的Go结构体。对于可重复的枚举repeated MyEnum bar 2;编译器会生成带有类型为[]MyEnum, 名为Bar的字段的Go结构体。 map字段 每个映射字段会在Go的结构体中生成一个map[TKey]TValue类型的字段其中TKey是字段的键类型TValue是字段的值类型。对于下面这个消息定义 message Bar {}message Baz {mapstring, Bar foo 1; }编译器生成Go结构体 type Baz struct {Foo map[string]*Bar }枚举 给出如下枚举 message SearchRequest {enum Corpus {UNIVERSAL 0;WEB 1;IMAGES 2;LOCAL 3;NEWS 4;PRODUCTS 5;VIDEO 6;}Corpus corpus 1; }编译器将会生成一个枚举类型和一系列该类型的常量。 对于消息中的枚举像上面那样类型名字以消息名开头 type SearchRequest_Corpus int32对于包级别的枚举 // .proto enum Foo {DEFAULT_BAR 0;BAR_BELLS 1;BAR_B_CUE 2; }Go中的类型不会对proto中的枚举名称进行修改 type Foo int32此类型具有String()方法该方法返回给定值的名称。 Enum()方法使用给定值初始化新分配的内存并返回相应的指针 func (Foo) Enum() *Foo编译器为枚举中的每个值生成一个常量。对于消息中的枚举常量以消息的名称开头 const (SearchRequest_UNIVERSAL SearchRequest_Corpus 0SearchRequest_WEB SearchRequest_Corpus 1SearchRequest_IMAGES SearchRequest_Corpus 2SearchRequest_LOCAL SearchRequest_Corpus 3SearchRequest_NEWS SearchRequest_Corpus 4SearchRequest_PRODUCTS SearchRequest_Corpus 5SearchRequest_VIDEO SearchRequest_Corpus 6 )对于包级别的枚举常量以枚举名称开头: const (Foo_DEFAULT_BAR Foo 0Foo_BAR_BELLS Foo 1Foo_BAR_B_CUE Foo 2 )protobuf编译器还生成从整数值到字符串名称的映射以及从名称到值的映射 var Foo_name map[int32]string{0: DEFAULT_BAR,1: BAR_BELLS,2: BAR_B_CUE, } var Foo_value map[string]int32{DEFAULT_BAR: 0,BAR_BELLS: 1,BAR_B_CUE: 2, }
http://www.hkea.cn/news/14572824/

相关文章:

  • 北京高端建设网站一件代发48个货源网站
  • 网站可以在手机上做吗机票网站开发知乎
  • 网页制作与网站设计论文台州公司做网站
  • vs2005做网站手机网站软件
  • 手机网站表单验证上海短视频推广公司
  • 做彩票网站被捉将受到什么惩罚哈尔滨网站制作策划
  • 科大讯飞哪些做教学资源的网站如何在yy做电影网站
  • 哪些行业没有做网站中国建筑网校
  • 企业网站建设综合实训心得体会想开一个做网站的公司
  • 做电子购物网站需要申请网站设计布局的重要性
  • 快速生成网站程序电子商务发展现状与趋势
  • 青岛做英文网站的公司招商网站大全
  • 百度网盟推广官网入口seo搜索引擎优化怎么优化
  • 个人网站备案要求ps切图做网站
  • 平面设计的网站有哪些成都网销网站
  • 保安做网站微视看视频领红包下载安装
  • 免费建站建设网站wordpress输入正确密码无法登陆
  • 如何制作一网站wordpress侧边栏折叠菜单
  • 系统网站建设wordpress 播放音频
  • 做一个个人网站的步骤网站建设兼职平台
  • 邹城网站网站建设口碑好的高密网站建设
  • 鹤壁高端网站建设如何做网站后台
  • 郑州哪里有做网站的网页设计板式网站
  • 网站年费网站建设要注意
  • 宜昌最权威网站建设公司网站建设服务费一年多少钱
  • 怎样申请免费网站空间深圳几个区
  • 阿里巴巴有几个网站是做外贸的网站优化 检测响应速度
  • 网站监测浏览器类型全国十大外贸平台
  • 兴义市住房和城乡建设局网签网站制作好的网站
  • 网站建设与推广完美结合学院招生网站建设方案