我有一个包含名称的字符串(如“my / package / test”),我想导入它并从包中调用一些函数。
这样的事情:
func init() {
var pkg string = "test/my/pkg"
import pkg
pkg.Test()
}
PS。谢谢你的帮助
答案 0 :(得分:4)
Go语言不允许您在示例中提到的内容。这是一种有意识的选择。在我看来,这种选择背后的原因与编译器性能和机器对代码理解的简易性有关。例如,这可以使gofix等工具能够部分修复Go代码而无需用户干预。
它还使程序员能够清楚地看到程序使用的所有静态导入的包。
另请参阅Go语言规范中source file organization的语法规则。
关于在运行时动态加载包:Go不支持在运行时加载包。未来的Go运行时可能会实现此功能(例如,偶尔会在golang-nuts邮件列表中的消息中请求它),但目前的状态是不支持此功能。
答案 1 :(得分:2)
这在Go中是不可能的。链接器必须在编译时知道依赖关系,但是在运行时会对您的字符串(和init函数)进行评估。另请注意,未使用的程序部分,即未明确引用的所有部分,甚至不会成为最终二进制文件的一部分 - 因此也无法进行反射。
如果你需要这样的东西,你必须自己管理映射。例如,您可以在一个包中使用全局映射,并使用其他包中的init函数通过将相关函数添加到映射来注册它们。之后,您可以使用地图动态查看。
例如,查看http包。在虚构的博客包中,您可以使用blog.init()函数使用http.HandleFunc(模式,处理程序)函数注册几个http处理程序。然后主包可以调用http.ListenAndServe(),它在运行时查找右边的处理程序。