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

use*_*031 5 go

假设我有一些包裹

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

然后从我的主要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'")
}
Run Code Online (Sandbox Code Playgroud)

有没有办法从软件包“ somepkg”访问导出的函数,然后调用它们?参数编号/类型在somepkg中的所有函数之间将是一致的。我已经查看了反射包,但不确定是否可以获取列表并调用函数而不知道包名以外的任何信息。但是,我可能会缺少godocs中的某些内容,因此不胜感激。我想要做的基本上是拥有一个系统,人们可以在其中插入.go文件,作为一种“插件”。这些“插件”将具有一个导出的函数,主程序本身将使用一致的数量和类型的args对其进行调用。对此代码库的访问受到限制,因此贡献者可以随意执行任何代码,因此不会产生安全隐患。

注意:所有内容均已编译,因此没有运行时限制

我想做的是用python写的东西

# test.py
def abc():
    print "I'm abc"

def cba():
    print "I'm cba"
Run Code Online (Sandbox Code Playgroud)

# 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+"()")
Run Code Online (Sandbox Code Playgroud)

运行foo.py返回

I'm abc
I'm cba
Run Code Online (Sandbox Code Playgroud)

golang有可能吗?

编辑:

我应该注意,我已经“完成”了一些与http://mikespook.com/2012/07/function-call-by-name-in-golang/类似的操作,但要求每个其他“插件”都添加其将函数导出到程序包全局映射。虽然这个“可行”,但感觉很hacky(好像整个程序不是...大声笑;),并且如果我可以不需要插件编写者的任何其他工作就可以了。基本上,我想使其尽可能“掉下来”。

Ben*_*ish 0

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

操场

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