【Protobuf速成指南】oneof类型的使用

news2025/2/13 18:58:15

文章目录

  • 2.3 oneof 类型
    • 一、基本认识
    • 二、 3.2 oneof相关函数
    • 三、Contact2.3 改写

2.3 oneof 类型

 本系列文章将通过对通讯录项目的不断完善,带大家由浅入深的学习Protobuf的使用。这是Contacts的2.3版本,在这篇文章中将带大家学习Protobuf的 oneof 语关键字,并将其用到我们的项目中

一、基本认识

 oneof类型可以同时包含多个类型的字段,但是同时只能有一个字段被设置。在我们有多选一的需求时,oneof字段可强化这个行为,同时也能有节约内存的效果。

message PeopleInfo{
    string name = 1;
   	// ……
    oneof other_contact{
        string qq = 5;
        string wechat = 6;
    }
}

oneof有如下的语法规定:

  1. oneof内的字段和上一层的字段属于同一级别,因此不能重名

  2. oneof内的字段不能用 Repeated 修饰

  3. oneof内同时只能有一个字段被设置。如果oneof字段被重复设置,则以最后设置的结果为准

二、 3.2 oneof相关函数

我们在 .proto 文件中添加“其他联系方式”字段,并使用oneof修饰

syntax = "proto3";
package contact2;

message Address{
    string home = 1;
    string company = 2;
}

message PeopleInfo{
    string name = 1;
    int32 age = 2;
    message Phone{   
        string number = 1;
        enum PhoneType{
            MOBILE = 0;
            FIXED = 1;
        }
        PhoneType type = 2;
    }
    repeated Phone phone = 3;
    google.protobuf.Any addr = 4;
    
// ----------- 添加部分 ----------
    oneof other_contact{
        string qq = 5;
        string wechat = 6;
    }
// -------------------------------
}

message Contact{
    repeated PeopleInfo contact = 1;
}

重新编译 .proto 文件后,观察学习新生成的代码

  • oneof字段被解释成枚举类型,内容如下:

    enum OtherContactCase {
        kQq = 5,
        kWechat = 6,
        OTHER_CONTACT_NOT_SET = 0,
    };
    
  • 对于qq,wechat字段,除了基本的设置、获取、清空等所有字段都会生成的函数外,还生成了 has_xx 函数,用来判断该字段是否被设置

    bool has_qq() const;
    bool has_wechat() const;
    
  • x_case()函数用来判断oneof字段中哪一个字段被设置

    image-20230611090859623

三、Contact2.3 改写

write.cc

cout << "请选择其他联系方式:(0.NULL   1. QQ   2.wechat)";
int other;
cin >> other;
cin.ignore(256, '\n');

switch(other){
    case 1:{
        cout << "请输入联系人QQ号: ";
        string QQ_number;
        getline(cin, QQ_number);
        p->set_qq(QQ_number);
        break;
    }
    case 2:{
        cout << "请输入联系人微信号: ";
        string wechat_number;
        getline(cin, wechat_number);
        p->set_wechat(wechat_number);
        break;
    }
    default:
        break;
}

image-20230611092859657

read.cc

// 方式一:用 has 方法判断字段是否被设置
if(people.has_qq()){
    cout << "qq号: " << people.qq() << endl;
}else if(people.has_wechat()){
    cout << "微信号: " << people.wechat() << endl;
}

// 方式二:使用 case 方法直接返回被设置的字段。扩展性更好
switch(people.other_contact_case()){
    case contact2::PeopleInfo::OtherContactCase::kQq:{
        cout << "qq号: " << people.qq() << endl;
        break;
    }
    case contact2::PeopleInfo::OtherContactCase::kWechat:{
        cout << "微信号: " << people.wechat() << endl;
        break;
    }
}

image-20230611092949747


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/645462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

医院监控4大难点如何破解?这个方法太顶了

在医院环境中&#xff0c;许多重要的设备对于病人的诊断、治疗和监护至关重要。为了确保这些设备的正常运行和安全性&#xff0c;动环监控系统可以发挥关键作用。 客户案例 四川某大型综合医院引入了动环监控系统来监控其重要设备&#xff0c;如手术室设备、监护设备和医疗影像…

【Android自动化测试】Ui Automator技术(以对QQ软件自动发说说为例)

文章目录 一、引言二、了解&#xff08;Android官方文档&#xff09;1、UiDevice 类2、UI Automator API3、UI Automator 查看器 三、使用1、依赖2、代码 一、引言 描述&#xff1a;UI Automator 是一个界面测试框架&#xff0c;适用于整个系统上以及多个已安装应用间的跨应用…

使用Unity开发一个游戏类型的区块链 [独立区块链]

Arouse Blockchain [Unity独立区块链] 这是一个学习性质的项目&#xff0c;使用了Unity进行独立区块链游戏的开发。使用此项目&#xff0c;将默认你有一定的Unity基础&#xff0c;如果你是Unity小白&#xff0c;可以先学习Unity&#xff0c;B站有大量的教材。 内容列表 项目的状…

【RV1126】按键中断--使用输入子系统事件方式

文章目录 选择GPIO修改设备树修改驱动源码probe&#xff1a;增加外部中断以及定时器服务函数。命令行测试中断确定按键的输入子系统的event使用hexdump命令测试按键实际效果 测试应用程序完整的驱动代码 我使用的是荣品的pro-rv1126。 选择GPIO 结合原理图 决定使用UART1接口 …

SIFT算法分析

引言 尺度不变特征变换&#xff08;SITF&#xff09;是传统机器学习算法当中比较难的一个算法&#xff0c;步骤也相对其它传统机器学习算法要更多一些。 使用场景 以上是一个图像拼接的过程&#xff0c;两张图像拼接成一张图&#xff0c;有时候由于镜头限制&#xff0c;不能一…

基于Google breakpad编译构建和使用案例

Googlepad是一款用于程序崩溃时自动生成转储文件&#xff08;.dmp&#xff09;的可跨平台开源库。 1.Googlepad代码下载地址&#xff1a; git clone https://chromium.googlesource.com/breakpad/breakpad 如果翻不了墙可以在gitee上下载breakpad模块。 2.Googlepad采用gyp来…

C语言之实用调试技巧(2)

如何写出好&#xff08;易于调试&#xff09;的代码 优秀的代码&#xff1a; 1. 代码运行正常 2. bug很少 3. 效率高 4. 可读性高 5. 可维护性高 6. 注释清晰 7. 文档齐全 常见的 coding 技巧&#xff1a; 1. 使用assert 2. 尽量使用const 3. 养成良好的编码风格 4. …

Linux防火墙学习笔记14

firewalld是什么&#xff1f; Firewalld属于动态防火墙&#xff0c;是CentOS7系统中用于对netfilter内核模块用户空间管理工具。 Firewalld仅仅代替了iptables service部分&#xff0c;其底层还是使用iptables作为防火墙规则管理工具。 Firewalld中zone概念及作用&#xff1…

盖茨预言AI助理成标配,AI+RPA打破AI准入高门槛!

根据微软联合创始人比尔盖茨的预测&#xff0c;未来顶级的人工智能公司将会开发一种全新的“个人AI助理”。比尔盖茨表示&#xff0c;“个人AI助理”将会具有出色的功能&#xff0c;可以改变人们的生活方式以及工作方式。无论哪一家公司能够赢得AI助理竞争先机&#xff0c;都会…

耗时半月,终于把CSDN上的Java面试八股文整理成了PDF合集(Java基础+Redis+MySQL+多线程与高并发+JVM+分布式+Spring+微服务)

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;近期的面试越来越难了&#xff0c;要背的八股文越来越多了&#xff0c;考察得越来越细&#xff0c;越来越底层&#xff0c;明摆着就是想让我们徒手造航母嘛&#xff01;实在是太为难我们这些程序员了。 这不&#xf…

Android:OKHttp

特点 支持HTTP2/SPDYSocket自动选择最好路线&#xff0c;并支持自动重连拥有自动维护的Socket连接池&#xff0c;减少握手次数拥有队列线程池&#xff0c;轻松写并发拥有Interceptors轻松处理请求与响应&#xff08;比如透明GZIP压缩&#xff09;实现基于Headers的缓存策略 基…

JDBC Apache—DBUtils 详解(通俗易懂)

目录 一、前言 二、Apache—DBUtils的引入 1.传统使用ResultSet的缺点 : 2.改进方法 : 3.改进方法的模拟实现 : 三、Apache—DBUtils的使用 1.基本介绍 : 2.准备工作 : 3.DBUtils查询(DQL) : 4.query方法源码分析 : 5.DBUtils处理(DML) : 四、总结 一、前言 第六节…

Web3下的去中心化契约

随着Web3的兴起&#xff0c;智能合约成为了这一新兴领域中最为重要的概念之一。智能合约是一种在区块链上执行的可编程代码&#xff0c;其作用类似于传统世界中的合约&#xff0c;但具有更多的灵活性和安全性。本文将介绍智能合约的基本概念、工作原理以及在Web3下的应用场景。…

如何提取视频里面的音频?简单三个方法即可完成!

分享3个简单易上手的视频提取音频方法&#xff0c;这些方法可以帮助你单独提取保存视频中的人物对话音频内容和背景音乐&#xff0c;并且提取成功的音频文件还可用于其他视频创作。 方法一&#xff1a;PR提取音频 Adobe Premiere Pro&#xff08;简称PR&#xff09;不仅可以用…

番外篇2 离线服务器 环境安装与配置

&#xff08;离线远程服务器旧版torch的卸载与安装问题&#xff09; Step4: 查看自己是否已经成功安装了Anaconda,输入此命令conda --version -------------------------------------------------------------------------------------------------------- Step1:离线创建con…

为什么浏览器突然打不开网页了?

苏生不惑第433 篇原创文章&#xff0c;将本公众号设为星标&#xff0c;第一时间看最新文章。 前几天写了什么是cookie总有人问我 Cookie 是什么&#xff1f;&#xff0c;说到Charles代理工具&#xff0c;但是为什么关了它就打不开网页呢&#xff1f;今天来说说这个。 Charles可…

企企通联合创始人兼总架构师杨华:剖析SRM顾问长期主义项目实践

近日&#xff0c;国产大飞机C919商业首飞成功引起广泛关注&#xff0c;此后&#xff0c;我们的出行选择中新增了一项“自己国家的大飞机”&#xff0c;给国人带来了更多的期待和自豪。 走难而正确的路&#xff0c;国产大飞机C919从项目立项到“一飞冲天”&#xff0c;花了十六年…

激活函数ReLU和SiLU的区别

文章目录 前言ReLU&#xff08;Rectified Linear Unit&#xff09;Leaky ReLUFReLU&#xff08;Flatten ReLU&#xff09;SiLU&#xff08;Sigmoid Linear Unit&#xff09;总结 前言 在这里&#xff0c;我就简单写一下两个激活函数的概念以及区别&#xff0c;详细的过程可以看…

2023年新风口,抖音的产业带服务商招募?怎么开通?

抖音电商致力于成为用户发现并获得优价好物的首选平台。众多抖音创作者通过短视频/直播等丰富的内容形式&#xff0c;给用户提供更个性化、更生动、更高效的消费体验。抖音电商积极引入优质合作伙伴&#xff0c;为品牌发展、商家变现提供多元的服务。 抖音产业带服务商招募区域…

操作系统常识

4.进程同步 1.什么是临界区&#xff1f;什么是临界资源 在计算机系统中&#xff0c;临界资源指的是被多个并发执行的线程或进程共享访问的某个资源&#xff0c;如共享内存区、共享文件等。 临界区指的是访问临界资源的那部分代码片段&#xff0c;它是一段需要保护的代码区域…