首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用类型开关来确定protoreflect.MessageDescriptor的类型?

如何使用类型开关来确定protoreflect.MessageDescriptor的类型?
EN

Stack Overflow用户
提问于 2022-08-25 07:04:12
回答 1查看 81关注 0票数 0

我正在使用原生质包编写一个原型生成插件。

我正在循环消息的字段,并希望确定某个字段是否属于少数几种不同的消息类型之一。

可以使用以下方法将消息类型的名称作为字符串获得:

代码语言:javascript
复制
field.Desc.Message().FullName() // mypackage.MyMessage

这种方法的问题是,我需要切换到一个字符串,这很容易出错:

代码语言:javascript
复制
switch field.Desc.Message().FullName(){
  case "mypackage.MyMessage":

  case "mypackage.MyMessage2":
}

是否可以使用类型断言来完成此操作?我试图使用动压创建消息实例,但类型断言不起作用:

代码语言:javascript
复制
mt := dynamicpb.NewMessage(field.Desc.Message())

msg, ok := mt.(*mypackage.MyMessage) // ok is false despite field.Desc.Message().FullName() returning mypackage.MyMessage
EN

回答 1

Stack Overflow用户

发布于 2022-08-25 09:23:23

函数dynamicpb.NewMessage不创建Golang结构mypackage.MyMessage。相反,它创建了一个数据结构,它将编组成与mypackage.MyMessage相同的二进制形式。

查看一下数据结构内部

代码语言:javascript
复制
// Operations which modify a Message are not safe for concurrent use.
type Message struct {
    typ     messageType
    known   map[protoreflect.FieldNumber]protoreflect.Value
    ext     map[protoreflect.FieldNumber]protoreflect.FieldDescriptor
    unknown protoreflect.RawFields
}

它只是字段值和字段元数据的存储。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73483231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档