谁能告诉我如何从字符串创建 Type 的新实例?反映?
有一些示例,但它们适用于较旧的(Go 1 之前的版本)语言 [:(]
所以,如果我正确理解你的问题,你是在问当你只有类型名称作为字符串时如何创建一个对象。例如,您可能有一个字符串“MyStruct”,并且您想要创建此类型的对象。
不幸的是,这并不容易实现,因为 Go 是一种静态类型语言,链接器将消除死代码(或其内联部分)。因此,不能保证您的最终可执行文件甚至会包含“MyStruct”的代码。
但是,您可以维护全局map[string]reflect.Type
手动。例如,通过在init()
定义此类可发现类型的包的函数。这也将告诉编译器您正在使用这些类型。之后,您可以使用此地图来查找反射类型 http://golang.org/pkg/reflect/#Type您要创建和使用的类型反映.新 http://golang.org/pkg/reflect/#New获取指向该类型的新对象的指针(存储为reflect.Value)。您可以将对象提取到接口中,如下所示:
reflect.New(yourtype).Elem().Interface()
Elem() http://golang.org/pkg/reflect/#Value.Elem将取消引用指针并界面() http://golang.org/pkg/reflect/#Value.Interface将返回反射值作为interface{}
. See 反思法则 http://blog.golang.org/2011/09/laws-of-reflection.html了解更多详情。
PS:可能有一种更好的方法来构造你的程序,它甚至不需要反射,并且可以让编译器捕获更多错误。您是否考虑过使用工厂方法 http://en.wikipedia.org/wiki/Factory_method_pattern例如?另一个简单的解决方案可能是维护map[string]func() interface{}
可以调用这些函数来创建具有该名称的新对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)