前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go: 在proto中使用oneof类型

go: 在proto中使用oneof类型

作者头像
超级大猪
发布2023-10-19 14:39:53
3640
发布2023-10-19 14:39:53
举报
文章被收录于专栏:大猪的笔记大猪的笔记

在proto中,可以使用OneOf类型,使用一个字段存储不同类型的数据。类似go中的interface。

假设有proto如下,Val是一个OneOf数据类型,它可以为double/int/str...中的任意一种。

TestPB中引用了value,类型为Val

代码语言:javascript
复制
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类型赋值:

代码语言:javascript
复制
    msg := &message.TestPB{
        Value: &message.Val{
        OneofVal: &message.Val_Str{Str: "hello"}, // 对oneof赋值需要使用Val包装,然后内部指定具体的类型
        },
    }

同理,使用=赋值也是可以的:

代码语言:javascript
复制
    msg.Value = &message.Val{
        OneofVal: &message.Val_Float{Float: 123},
    }

取值

假设知道值的类型,可以直接调用GetXXX方法取值。

代码语言:javascript
复制
    fv := msg.GetValue().GetStr()
    fmt.Printf("fv:%v\n", fv) // 输出 hello

但是如果这个值未设置或者不存在,则会返回这个类型的0值

这就带来问题,如何判定这个值是否已设置,如果已设置是什么类型?

可以使用switch类型判定的方式来解决需求,因为已经穷举了Val所有可能的类型,如果未设置值,会打印未设置值

代码语言:javascript
复制
    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的结构更紧凑,满足更多元化的需求。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档