【发布时间】:2021-06-09 02:19:14
【问题描述】:
Go 中是否有与 Java 等语言提供的动态类实例化功能等效的功能(注意:为简洁起见,此处省略了必要的异常处理逻辑):
Class cls = Class.forName("org.company.domain.User");
Constructor<User> userConstructor = cls.getConstructor();
User user1 = userConstructor.newInstance();
上面的简短 Java sn-p 本质上是通过提供的完全限定类路径 string 获取对 Class 的引用,然后使用类引用来获取对零参数构造函数的引用(其中存在一个) 最后构造函数用于获取对类实例的引用。
我还没有在 Go 中找到一个可以实现类似结果的类似机制的示例。更具体地说,似乎 go 中的 reflect 包要求调用者已经引用了他们希望实例化的结构类型。这方面的标准成语似乎如下:
reflect.New(reflect.TypeOf(domain.User))
注意:提供给 reflect.TypeOf 函数的参数必须是类型 不是字符串。一个结构可以在 Go 中通过 reflect 包实例化,只使用它的完全限定名吗?
【问题讨论】:
-
不,惯用的 Go 代码甚至不会尝试这样做。你想解决什么问题?
-
Go 程序通常通过创建将字符串映射到创建值的函数的注册表来处理这种情况。有关示例,请参见 sql.Register。
-
好吧,我怀疑很可能是这样。感谢您对这个 Adrian 的明确答复。
-
如果您的代码没有明确引用一个类型,则不能保证它最终会出现在您的可执行二进制文件中。讨论完毕。如果没有,显然无法创建该类型的值。
-
@GilesThompson 如果包在
init函数中注册包含的类型,则应用程序必须确保导入相关包。根据前面的评论,应用程序无论如何都必须这样做。
标签: go instantiation reflect