如何使用类型开关来确定原型反射的类型.消息描述符



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

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

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

field.Desc.Message().FullName() // mypackage.MyMessage

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

switch field.Desc.Message().FullName(){
case "mypackage.MyMessage":
case "mypackage.MyMessage2":
}

有没有使用类型断言来实现这一点?我试图使用dynamiccpc创建消息的实例,但类型断言不起作用:

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数据结构内部:

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

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

最新更新