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

优质的成都网站建设推/免费的网站域名查询565wcc

优质的成都网站建设推,免费的网站域名查询565wcc,企业做网站需要什么资料,怎样做google网站文章目录 一、介绍二、安装三、protoc3语法1、 protoc3 与 protoc2区别2、proto3生成go代码包Message内嵌Message字段单一标量字段单一message字段可重复字段slicemap字段枚举 一、介绍 Protobuf是Google旗下的一款平台无关,语言无关,可扩展的序列化结构…

文章目录

  • 一、介绍
  • 二、安装
  • 三、protoc3语法
    • 1、 protoc3 与 protoc2区别
    • 2、proto3生成go代码
      • Message
      • 内嵌Message
      • 字段
        • 单一标量字段
        • 单一message字段
        • 可重复字段slice
        • map字段
        • 枚举

一、介绍

ProtobufGoogle旗下的一款平台无关,语言无关,可扩展的序列化结构数据格式。所以很适合用做数据存储和作为不同应用,不同语言之间相互通信的数据交换格式,只要实现相同的协议格式,即同一proto文件被编译成不同的语言版本,加入到各自的工程中去,这样不同语言就可以解析其他语言通过Protobuf序列化的数据。目前官网提供了C++,Python,JAVA,GO等语言的支持。

二、安装

  1. Mac上安装Protoc3
  2. Windows安装Protoc3:可以查看本人的另一篇博客:windows安装protoc、protoc-gen-go、protoc-gen-go-grpc
  3. 安装protoc-gen-go
    protoc-gen-go是生成Go代码的protocolbuffers编译器。可以理解为一个编译器插件,配合protoc来使用。在命令行执行如下命令即可完成安装:
go get -u github.com/golang/protobuf/protoc-gen-go@latest

网上资料推荐的基本都是这个命令,但目前该模块已被弃用,继续使用该命令将出现错误,提示该库已经被弃用,让我们使用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_path=src --go_out=build/gen src/foo.proto src/bar/baz.proto

编译器会读取文件 src目录下的src/foo.protosrc/bar/baz.proto,这将会在build/gen目录下生成两个输出文件 build/gen/foo.pb.gobuild/gen/bar/baz.pb.go

如果有必要,编译器会自动生成 build/gen/bar目录,其中bar为我们在proto文件中指定的go文件包名,如option go_package = "/bar";,但是他不能创建 build或者 build/gen目录,这两个必须是已经存在的目录。

三、protoc3语法

1、 protoc3 与 protoc2区别

proto3proto2的基础上去掉了一些复杂的语法和特性,更强调约定而弱化语法。主要几点区别如下:

  1. proto文件第一行非空白非注释行,必须指定版本,syntax = "proto3";如果不指定,则默认是proto2
  2. 字段规则移除了 required,并把 optional改名为 singular,省略不写时,默认就是singular
  3. repeated字段默认采用 packed 编码,在 proto2 中,需要明确使用[packed=true] 来为字段指定比较紧凑的 packed 编码方式。
  4. 语言增加 Go、Ruby、JavaNano 支持,即在proto2时并不支持go语言。
  5. 移除了default 选项,在proto2中,可以使用default选项为某一字段指定默认值。在 proto3 中,字段的默认值只能根据字段类型由系统决定。也就是说,默认值全部是约定好的,而不再提供指定默认值的语法。在字段被设置为默认值的时候,该字段不会被序列化。这样可以节省空间,提高效率。
    但这样就无法区分某字段是根本没赋值,还是赋值了默认值。 所以一般需要避免将默认值作为任何行为的触发方式。例如
enum AudienceDisplayTypeEnum {NoValue = 0; // (占位符)说明端上没有传入此参数,请勿使用CurrentCount = 1; // 展示当前直播间内人数AccumulativeCount = 2; // 展示直播间累计人数SettingEntranceClosed = 99; // 端上拿到则不展示此选项,相当于配置项是否出现的开关
}

此例子是控制直播间展示在线人数还是看播人次的开关,开关仅两个取值:truefalse,但这里并没有使用bool类型,因为bool型默认值是false,即使前端没有给我们传该值,我们也会拿到false值,从而可能当成是前端传过来的值,切换开关,因此使用枚举。使用枚举后,不使用01表示开关的打开与关闭,因为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 {}
}

这种情况,编译器会生成两个结构体:FooFoo_Bar

字段

编译器会为每个在message中定义的字段生成一个Go结构体的字段,字段的确切性质取决于它的类型以及它是singular,repeated,map还是oneof字段。

注意生成的Go结构体的字段将始终使用驼峰命名,即在.proto文件中消息字段用的是小写加下划线(工作中基本都是这种形式),生成的Go代码会是大驼峰命名。大小写转换的原理如下:

  • 首字母会大写,如果message中字段的第一个字符是_,它将被替换为X
  • 如果内部下划线后跟小写字母,则删除下划线,并将后面跟随的字母大写。
    因此,proto字段foo_bar_bazGo中变成FooBarBaz _my_field_name变为XMyFieldName
单一标量字段

对于包级别字段定义:

int32 id = 1;

编译器将生成一个带有名为Idint32字段和一个访问器方法GetId()的结构,该方法返回结构体中Id字段的零值(如果字段未设置(数值型零值为0,字符串为空字符串))。

单一message字段

给出如下消息类型

message Bar {}

对于一个有Bar类型字段的消息:

// proto3
message Baz {Bar foo = 1;
}

编译器将会生成一个Go结构体

type Baz struct {Foo *Bar
}

消息类型的字段可以设置为nil,这意味着该字段未设置。

编译器还生成一个func(m *Baz)GetFoo() *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 {map<string, 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,
}

相关文章:

53. Protocol buffer 的Go使用

文章目录 一、介绍二、安装三、protoc3语法1、 protoc3 与 protoc2区别2、proto3生成go代码包Message内嵌Message字段单一标量字段单一message字段可重复字段slicemap字段枚举 一、介绍 Protobuf是Google旗下的一款平台无关&#xff0c;语言无关&#xff0c;可扩展的序列化结构…...

如何访问内部网络做内网穿透

项目&#xff1a;https://github.com/ehang-io/nps 有个公网服务器&#xff0c;搭建服务端。 然后客户端使用&#xff1a; -server是服务端的访问方式。-vkey是秘钥。 ./npc -server192.227.19.12:8024 -vkeyoies8gq3wml -typetcp然后在服务端配置TCP隧道即可。...

git常用命令总结

生成公钥并在github添加公钥 ssh-keygen -t rsa -C **********测试是否可用 ssh -T gitgithub.com本地初始化 git init添加远程库 格式&#xff1a;git remote add [shortname] [url] git remote add origin gitgithub.com:TonyBeen/eular.git拉取指定仓库的代码 git pull orig…...

Apollo新版本Beta技术沙龙

有幸参加Apollo开发者社区于12月2日举办的Apollo新版本(8.0)的技术沙龙会&#xff0c;地址在首钢园百度Apollo Park。由于去的比较早&#xff0c;先参观了一下这面的一些产品&#xff0c;还有专门的讲解&#xff0c;主要讲了一下百度无人驾驶的发展历程和历代产品。我对下面几个…...

数据结构第二次作业——递归、树、图【考点罗列//错题正解//题目解析】

目录 一、选择题 ——递归—— 1.【单选题】 ——递归的相关知识点 2.【单选题】——递归的应用 3.【单选题】——递归的实现结构 4.【单选题】——递归的执行与实现 5.【单选题】 ——递归算法 ——树—— 6.【单选题】 ——树的结构 *7.【单选题】——树的知识点 …...

Redis--12--Redis分布式锁的实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Redis分布式锁最简单的实现如何避免死锁&#xff1f;锁被别人释放怎么办&#xff1f;锁过期时间不好评估怎么办&#xff1f;--看门狗分布式锁加入看门狗 redissonRe…...

MongoDB简介与安装

目录 1. MongoDB简介 2. 安装MongoDB 3. 基本命令行操作 4. Java代码实践 MongoDB是一种NoSQL数据库&#xff0c;以其灵活的文档存储模型和高度可扩展性而闻名。这篇文章将简单介绍一下MongoDB的基本概念&#xff0c;包括其特点和优势&#xff0c;并提供安装MongoDB的步骤。…...

Avaya Aura Device Services 任意文件上传漏洞复现

0x01 产品简介 Avaya Aura Device Services是美国Avaya公司的一个应用软件。提供一个管理 Avaya 端点功能。 0x02 漏洞概述 Avaya Aura Device Services 系统PhoneBackup接口处存在任意文件上传漏洞&#xff0c;攻击者可绕过验证上传任意文件获取服务器权限。 0x03 影响范围…...

C#注册表技术及操作

目录 一、注册表基础 1.Registry和RegistryKey类 &#xff08;1&#xff09;Registry类 &#xff08;2&#xff09;RegistryKey类 二、在C#中操作注册表 1.读取注册表中的信息 &#xff08;1&#xff09;OpenSubKey()方法 &#xff08;2&#xff09;GetSubKeyNames()…...

js/jQuery常见操作 之各种语法例子(包括jQuery中常见的与索引相关的选择器)

js/jQuery常见操作 之各种语法例子&#xff08;包括jQuery中常见的与索引相关的选择器&#xff09; 1. 操作table常见的1.1 动态给table添加title&#xff08;指定td&#xff09;1.1.1 给td动态添加title&#xff08;含&#xff1a;获取tr的第几个td&#xff09;1.1.2 动态加工…...

C语言数组(下)

我希望各位可以在思考之后去看本期练习&#xff0c;并且在观看之后独立编写一遍&#xff0c;以加深理解&#xff0c;巩固知识点。 练习一&#xff1a;编写代码&#xff0c;演⽰多个字符从两端移动&#xff0c;向中间汇聚 我们依旧先上代码 //编写代码&#xff0c;演⽰多个字…...

pytorch学习5-最大池化层的使用

系列文章目录 pytorch学习1-数据加载以及Tensorboard可视化工具pytorch学习2-Transforms主要方法使用pytorch学习3-torchvisin和Dataloader的使用pytorch学习4-简易卷积实现pytorch学习5-最大池化层的使用pytorch学习6-非线性变换&#xff08;ReLU和sigmoid&#xff09;pytorc…...

在python中安装库,会有conda安装,也会有pip安装,conda与pip的区别是什么?

文章目录 一、Conda是什么&#xff1f;二、pip是什么&#xff1f;三、pip与conda的区别&#xff1a;总结 一、Conda是什么&#xff1f; Conda是一个开源的包管理系统&#xff0c;它是Anaconda公司为Python和其他编程语言开发的。它主要用于数据科学和机器学习领域&#xff0c;…...

算法-贪心思想

贪心的思想非常不好解释&#xff0c;而且越使用权威的语言解释越难懂。而且做题的时候根据自己的理解可能直接做出来&#xff0c;但是非要解释一下怎么使用的贪心的话&#xff0c;就懵圈了。一般来说&#xff0c;贪心的题目没有固定的套路&#xff0c;一题一样&#xff0c;不过…...

STL源码剖析笔记——适配器(adapters)

系列文章目录 STL源码剖析笔记——迭代器 STL源码剖析笔记——vector STL源码剖析笔记——list STL源码剖析笔记——deque、stack&#xff0c;queue STL源码剖析笔记——Binary Heap、priority_queue STL源码剖析笔记——AVL-tree、RB-tree、set、map、mutiset、mutimap STL源…...

Mysql、Oracle区分大小写?

Mysql Windows 系统的文件名不区分大小写&#xff0c;所以运行在 Windows 系统上面的 MySQL 服务器也不用区分数据库名和表名的大小写。Linux 系统大小写规则&#xff1a; 数据库名与表名严格区分大小写表的别名严格区分大小写变量名严格区分大小写列名与列的别名忽略大小写 M…...

Java多线程并发(二)

四种线程池 Java 里面线程池的顶级接口是 Executor&#xff0c;但是严格意义上讲 Executor 并不是一个线程池&#xff0c;而只是一个执行线程的工具。真正的线程池接口是 ExecutorService。 newCachedThreadPool 创建一个可根据需要创建新线程的线程池&#xff0c;但是在以前…...

树莓派外接上显示器以后一直黑屏无画面显示

一般遇到这种情况都是因为没有强制支持热插拔引起的&#xff0c;先断电树莓派&#xff0c;确保显示器与树莓派连接正常&#xff0c;然后上电就可以正常显示了。 如果想要支持热插拔&#xff0c;可以修改配置文件。 sudo nano /boot/config.txt 修改如下配置 hdmi_force_hotpl…...

使用Ansible lineinfile模块进行行级别操作

Ansible是一种功能强大的自动化工具&#xff0c;它提供了各种模块来简化配置管理任务。其中&#xff0c;lineinfile模块是一种特别有用的模块&#xff0c;它允许我们在文件中插入、修改或删除行。本文将介绍Ansible的lineinfile模块&#xff0c;并演示如何使用它来进行行级别操…...

curl 18 HTTP/2 stream

cd /Users/haijunyan/Desktop/CustomKit/KeepThreadAlive/KeepThreadAlive //Podfile所在文件夹 git config --global https.postBuffer 10485760000 git config --global http.postBuffer 10485760000 pod install https://blog.csdn.net/weixin_41872403/article/details/86…...

5G+AI开花结果,助力智慧安检落地

“请带包的乘客过机安检&#xff01;”&#xff0c;深圳地铁、腾讯共同打造的5GAI智慧安检辅助系统亮相福田枢纽站&#xff0c;进一步解放了人力&#xff0c;提高安检效率&#xff0c;为交通安全保驾护航&#xff0c;让智慧出行成为现实。 传统的安检设备均为人工肉眼辨识&…...

Swift 如何实现自定义 Tab Bar

前言 每个 UI 设计师都喜欢美丽而有动画效果的 Tab Bar。然而&#xff0c;对于开发人员来说&#xff0c;实现这种设计可能是一场噩梦。当然&#xff0c;使用 Apple 的原生 Tab Bar 组件并专注于更有趣的事情&#xff0c;比如业务逻辑的实现&#xff0c;会更容易。但如果我们必…...

mysql 语言学习

整理了一下 mysql 操作语言&#xff0c;不是很全&#xff0c;部分地方也许需要修改&#xff0c;先放上来&#xff0c;有时间再慢慢完善。 一、数据库操作 连接数据库 $ sudo mysql [-h ip] -u root -p [-P 3306] 初始化数据库 $ mysql_secure_installation备份数据库 # 备…...

微信小程序基础bug

1.苹果11手机小程序请求数据不显示 设置-》隐私-》分析与改进-》开启 ”与开发者共享“ 2.<navigator>组件回退delta不成功 tabBar 页面是不能实现后退的效果的. 因为, 当我们跳转到 tabBar 页面&#xff0c;会关闭其他所有非tabBar 页面,所以当处于 tabBar 页面时, 无…...

13、pytest为失败的断言定义自己的解释

官方实例 # content of ocnftest.py from test_foocompare import Foodef pytest_assertrepr_compare(op, left, right):if isinstance(left, Foo) and isinstance(right, Foo) and op "":return["Comparing Foo instances:",f" vals:{left.val} !…...

Flink优化——数据倾斜(二)

目录 数据倾斜 判断是否存在数据倾斜 数据倾斜的解决 KeyBy之前发生数据倾斜 KeyBy之后发生的数据倾斜 聚合操作存在数据倾斜 窗口聚合操作存在数据倾斜 数据倾斜 判断是否存在数据倾斜 相同 Task 的多个 Subtask 中&#xff0c;个别 Subtask 接收到的数据量明显大于其…...

Unity打包到Webgl平台以及遇到的问题

Unity打包到Webgl平台以及遇到的问题 参考网站 Unity打包WebGL的全过程及在打包和使用过程中会遇到的问题(本地测试)-CSDN博客 unity打包到Webgl 并配置能正常运行 这里我用的是Unity2022.3.3f1c1版本 有两种方法 1、配置本地web服务 2、安装vsCode>添加插件LiveServe…...

c语言编程题经典100例——(90~95例)

1,写一个函数&#xff0c;实现数字的加密和解密。 下面是一个简单的C语言函数&#xff0c;可以实现数字的加密和解密。这个函数采用简单的加密算法&#xff0c;将输入的数字乘以一个固定的密钥&#xff0c;然后加上一个固定的偏移量。解密过程就是将加密后的数字减去偏移量&am…...

Redis核心知识点总结

1.Redis介绍 Redis 是 NoSQL&#xff0c;但是可处理 1 秒 10w 的并发&#xff08;数据都在内存中&#xff09; 使用 java 对 redis 进行操作类似 jdbc 接口标准对 mysql&#xff0c;有各类实现他的实现类&#xff0c;我们常用的是 druid 其中对 redis&#xff0c;我们通常用 J…...

stm32Flash操作

//G0B0 flash大小 0x08000000-0x0807FFFF 512K(0400 1K)//2k 1页 //初始化标记数据地址 放最前面 脱机烧写器可擦除掉 #define CONST_INITMARKDATA_ADDRESS (0x0807D000UL) //2k 1页 //射频数据地址 #define CONST_FREQDATA_ADDRESS (0x0807F000UL) //2…...