从golang中的包中获取导出函数的列表

时间:2016-06-16 15:41:06

标签: go

假设我有一些包

// ./somepkg/someFile.go
package somepkg
import "fmt"
func AnExportedFunc(someArg string) {
    fmt.Println("Hello world!")
    fmt.Println(someArg)
)

我从我的主要文件

导入它
// ./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文件作为一种“插件”。这些“插件”将具有单个导出功能,主程序本身将调用具有一致数量和类型的args。对此代码库的访问受到限制,因此贡献者执行任意代码时不存在安全问题。

注意:这是全部编译的,因此没有运行时限制

如果用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/非常相似的东西“完成”了这一点,但要求每个额外的“插件”将其导出的函数添加到包全局映射中。虽然这“工作”,但这感觉很hacky(好像整个程序不是......大声笑;)并且更愿意,如果我能做到这一点而不需要插件编写者的任何额外工作。基本上我想尽可能地“匆匆而去”。

1 个答案:

答案 0 :(得分:0)

最简单的方法是使用template库来解析代码并在适当的位置插入新的包名称。

Playground

您可以通过加载调用用户包的所有决赛来使用它,然后将生成的文件输出到执行目录。