登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-17 22:18:34 457浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《如何使用类型开关来确定 protoreflect.MessageDescriptor 的类型?》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

我正在使用 protogen 包编写一个 protoc 生成插件。

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

可以使用以下方式获取字符串形式的消息类型名称:

field.desc.message().fullname() // mypackage.mymessage

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

switch field.desc.message().fullname(){
  case "mypackage.mymessage":

  case "mypackage.mymessage2":
}

有没有办法使用类型断言来做到这一点?我尝试使用dynamicpc创建消息的实例,但类型断言不起作用:

mt := dynamicpb.NewMessage(field.Desc.Message())

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

正确答案


函数 dynamicpb.newmessage 不会创建 golang 结构 mypackage.mymessage。相反,它创建一个数据结构,该数据结构编组为与 mypackage.mymessage 相同的二进制形式

看看 Message data structure 的内部:

// 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
}

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

好了,本文到此结束,带大家了解了《如何使用类型开关来确定 protoreflect.MessageDescriptor 的类型?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>