我正在使用原生质包编写一个原型生成插件。
我正在循环消息的字段,并希望确定某个字段是否属于少数几种不同的消息类型之一。
可以使用以下方法将消息类型的名称作为字符串获得:
field.Desc.Message().FullName() // mypackage.MyMessage这种方法的问题是,我需要切换到一个字符串,这很容易出错:
switch field.Desc.Message().FullName(){
case "mypackage.MyMessage":
case "mypackage.MyMessage2":
}是否可以使用类型断言来完成此操作?我试图使用动压创建消息实例,但类型断言不起作用:
mt := dynamicpb.NewMessage(field.Desc.Message())
msg, ok := mt.(*mypackage.MyMessage) // ok is false despite field.Desc.Message().FullName() returning mypackage.MyMessage发布于 2022-08-25 09:23:23
函数dynamicpb.NewMessage不创建Golang结构mypackage.MyMessage。相反,它创建了一个数据结构,它将编组成与mypackage.MyMessage相同的二进制形式。
查看一下数据结构内部
// 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
}它只是字段值和字段元数据的存储。
https://stackoverflow.com/questions/73483231
复制相似问题