函数
我正在使用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
}
它只是字段值和字段元数据的存储区。