go: 在proto中使用oneof类型
在proto中,可以使用OneOf类型,使用一个字段存储不同类型的数据。类似go中的interface。
假设有proto如下,Val是一个OneOf数据类型,它可以为double/int/str...中的任意一种。
TestPB中引用了value
,类型为Val
。
syntax = "proto3";
package protooneof;
option go_package = "pb/message";
message Val{
oneof oneof_val {
double double = 1;
int64 int = 2;
string str = 3;
bytes bytes = 4;
uint64 uint = 5;
float float = 6;
}
}
message TestPB {
Val value = 1;
}
赋值
编译这个proto,可以使用以下的代码对Val类型赋值:
msg := &message.TestPB{
Value: &message.Val{
OneofVal: &message.Val_Str{Str: "hello"}, // 对oneof赋值需要使用Val包装,然后内部指定具体的类型
},
}
同理,使用=
赋值也是可以的:
msg.Value = &message.Val{
OneofVal: &message.Val_Float{Float: 123},
}
取值
假设知道值的类型,可以直接调用GetXXX
方法取值。
fv := msg.GetValue().GetStr()
fmt.Printf("fv:%v\n", fv) // 输出 hello
但是如果这个值未设置或者不存在,则会返回这个类型的0值。
这就带来问题,如何判定这个值是否已设置,如果已设置是什么类型?
可以使用switch类型判定的方式来解决需求,因为已经穷举了Val
所有可能的类型,如果未设置值,会打印未设置值
。
switch v := msg.GetValue().GetOneofVal().(type) {
case *message.Val_Int:
fmt.Printf("int val:%v\n", v.Int)
case *message.Val_Float:
fmt.Printf("float val:%v\n", v.Float)
case *message.Val_Double:
fmt.Printf("double val:%v\n", v.Double)
case *message.Val_Str:
fmt.Printf("str val:%v\n", v.Str)
case *message.Val_Bytes:
fmt.Printf("bytes val:%v\n", v.Bytes)
case *message.Val_Uint:
fmt.Printf("uint val:%v\n", v.Uint)
default:
fmt.Printf("未设置值\n")
}
通过善用Oneof类型,可以让pb的结构更紧凑,满足更多元化的需求。
go: 在proto中使用oneof类型的更多相关文章
- Entity Framework 教程——Entity Framework中的实体类型
Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. ...
- Python中内置数据类型list,tuple,dict,set的区别和用法
Python中内置数据类型list,tuple,dict,set的区别和用法 Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, ...
- 向mysql中插入Date类型的数据
先看数据库表的定义 date字段为sql.date类型.我要向其中插入指定的日期和当前日期. 一.插入当前日期 思路:先获取当前系统,在将当前系统时间转换成sql类型的时间,然后插入数据库.代码如下 ...
- 在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)
说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...
- Python 中的枚举类型~转
Python 中的枚举类型 摘要: 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等. 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表 ...
- UNIX中的文件类型
Unix的文件类型信息包含在stat结构的st_mode成员中可以用宏确定文件类型: 普通文件(S_ISREG()):包含某种形式数据的常用文件类型 目录文件(S_ISDIR()):这种文件包含其他文 ...
- 命名空间“System.Web”中不存在类型或命名空间名称“Optimization”(是否缺少程序集引用?)
今天,在.net4.5,mvc4下新建了个区域,运行起来就报这个错误: 命名空间"System.Web"中不存在类型或命名空间名称"Optimization"( ...
- C#解决一个奇怪的,命名空间“XXX”中不存在类型或命名空间名称“xxx”的问题
最近做项目时,引用了一个第三方的程序集,代码层面没有任何语法错误,编译提示:命名空间"System.Net"中不存在类型或命名空间名称"FtpClient".是 ...
- [delphi]向ImageList中加入png类型的资源图片
向ImageList中动态加入Png图片有些失真,经过多方查询,发现需要将Bitmap的AlphaFormat指定一下. //向ImageList中加入png类型的资源图片 procedure Add ...
- 在 Typescript 2.0 中使用 @types 类型定义
在 Typescript 2.0 中使用 @type 类型定义 基于 Typescript 开发的时候,很麻烦的一个问题就是类型定义.导致在编译的时候,经常会看到一连串的找不到类型的提示.解决的方式经 ...
随机推荐
- 人工智能领域在显卡短缺之下的思考——“【亦】微笑面对显卡短缺:不买更快乐”有感——mindspore快快成长
划水之时看了看B站视频: [亦]微笑面对显卡短缺:不买更快乐 https://www.bilibili.com/video/BV1RZ4y1c7qT 在显卡短缺之下不仅仅电脑游戏玩家被卡脖子就连高校和 ...
- 局域网中如何为Ubuntu20.04和window10共享文件
如题,自己有两台电脑,一个安装的window10,一个安装的是Ubuntu20.04,两个电脑之间经常需要传文件,这个时候总是用U盘来回导文件就变得十分的不方便,于是就想到了设置网络共享. 本文的做法 ...
- 清除 Nuxt 状态缓存:clearNuxtState
title: 清除 Nuxt 状态缓存:clearNuxtState date: 2024/8/7 updated: 2024/8/7 author: cmdragon excerpt: 摘要:本文介 ...
- mongodb 中嵌套数组的且查询
如果在mongodb中存在如下数据 { audit:{ experts:[{expertId:"1",result:"success",......} {exp ...
- rcc of stm32
1. G0 2. F0 / F1 / F3 F0 F1 F3 3. F2/F4 F205 f429 f7
- openstack硬盘扩容
1.挂载好新硬盘后输入fdisk -l命令看当前磁盘信息2.用fdisk /dev/vda 进行分区3.进入fdisk命令,输入h可以看到该命令的帮助,按n进行分区4.这里输入e即分为逻辑分区,按p即 ...
- [Linux]yum下载慢!!
有全局代理,但是yum下载特别慢,怎么办? 确保/etc/yum.conf文件中代理配置的语法正确,包括代理服务器的地址和端口号,如下所示: proxy=http://your_proxy_serve ...
- LOTO示波器统计曲线和故障分析pass/fail测试
LOTO示波器统计曲线和故障分析pass/fail测试 虚拟示波器可以应用在工业自动化检测中,除了常规的检测波形和测量值参数以外,由多个行业客户定制和验证的统计曲线和故障分析(pass/fail)功能 ...
- 浅谈下市面上流行的各种Linux操作系统
当前最流行的Linux操作系统之一是Ubuntu.它是一个基于Debian的开源操作系统,它的用户界面和易用性使得它成为许多用户的首选. 其他流行的Linux操作系统包括: Debian:一个稳定和可 ...
- 【YashanDB知识库】ycm纳管主机安装YCM-AGENT时报错“任务提交失败,无法连接主机”
问题现象 执行安装ycm-agent命令纳管主机时报错 问题的风险及影响 会导致ycm-agent纳管不成功,YCM无法监控主机和数据库 问题影响的版本 yashandb-cloud-manager- ...