假设我有一个包
// ./somepkg/someFile.go
package somepkg
import "fmt"
func AnExportedFunc(someArg string) {
fmt.Println("Hello world!")
fmt.Println(someArg)
)
我从我的主要go文件中导入它
// ./main.go
package main
import (
"./somepkg" // Let's just pretend I have the full path written out
"fmt"
)
func main() {
fmt.Println("I want to get a list of exported funcs from package 'somefolder'")
}
有没有一种方法可以访问包“somepkg”中导出的函数,然后调用它们?所有函数的参数数量/类型将在“somepkg”中保持一致。我已经查看了反射包,但不确定是否可以在不知道除包名称外的任何信息的情况下获取列表并调用函数。也许我在godocs中漏掉了某些内容,所以任何建议都将不胜感激。我的目标是创建一个系统,使人们可以将.go文件作为“插件”添加到其中。这些“插件”将具有单个导出函数,主程序本身将使用一致的参数数量和类型来调用该函数。由于对代码库的访问受到限制,因此不存在由贡献者执行任意代码的安全问题。
注意:这是编译后的代码,因此没有运行时限制。
如果用Python编写,我要做的就是这样的。
# test.py
def abc():
print "I'm abc"
def cba():
print "I'm cba"
并且
# foo.py
import test
flist = filter(lambda fname: fname[0] != "_", dir(test))
# Let's forget for a moment how eval() is terrible
for fname in flist:
eval("test."+fname+"()")
运行foo.py会返回:
I'm abc
I'm cba
在golang中是否可能实现这一点?
编辑:
我应该指出,我已经通过与http://mikespook.com/2012/07/function-call-by-name-in-golang/非常相似的东西来“完成”了这个问题,但需要将每个附加的“插件”添加其导出函数到包全局映射中。虽然这“可行”,但感觉很不专业(就像整个程序一样...lol;),而且希望如果可以不需要插件编写人员进行任何额外的工作来完成它。基本上我想使它尽可能地“即插即用”。