go - 实例新类型(Golang)

标签 go types instance go-reflect

谁能告诉我如何从一个字符串创建一个新的 Type 实例?反射(reflection)?

有一些示例,但它们适用于较旧的(Go 1 之前的版本)语言 [:(]

最佳答案

所以,如果我正确理解了您的问题,那么您是在询问当您将类型名称作为字符串时如何创建对象。因此,例如,您可能有一个字符串“MyStruct”,并且您想创建一个这种类型的对象。

不幸的是,这并不容易,因为 Go 是一种静态类型语言,并且链接器会消除死代码(或其中的内联部分)。因此,不能保证最终的可执行文件甚至会包含“MyStruct”的代码。

但是,您可以手动维护全局 map[string]reflect.Type。例如,通过在定义此类可发现类型的包的 init() 函数中初始化此映射。这也将告诉编译器您正在使用这些类型。之后,您可以使用此 map 查找reflect.Type您要创建和使用的类型reflect.New获取指向该类型的新对象的指针(存储为 reflect.Value)。您可以使用以下方式将对象提取到接口(interface)中:

reflect.New(yourtype).Elem().Interface()

Elem()将取消引用指针和Interface()将反射值作为 interface{} 返回。见 The Laws of Reflection了解更多详情。

PS:可能有一种更好的方法来构建您的程序,它甚至不需要反射,并且可以让编译器捕获更多错误。您是否考虑过使用 factory method例如?另一个简单的解决方案可能是维护一个 map[string]func() interface{} 函数,可以调用这些函数来创建具有该名称的新对象。

关于go - 实例新类型(Golang),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10210188/

相关文章:

go - Go中限制并发的简单方法

python - 如何使用golang使用ecdsa私钥对消息进行签名?

go - 在 Go 中实现工作人员池

python - 用户定义类型的元类 __new__ 和 __init__ 在哪里被调用?

javax.lang.模型 : How do I get the type of a field?

ios - 如何在实例方法中访问类方法变量或对两者使用公共(public)变量?

go - 为什么golang strings.Builder 是这样实现String()的?

java - 参数类型的运算符 < 未定义

java - 每个实例记录器,不好的做法?

properties - 多个实例中的 Swift 唯一属性