golang从插件导出所有符号

golang从插件导出所有符号,go,plugins,lookup,Go,Plugins,Lookup,Golang plugin pkg仅支持按名称查找符号 如何扫描插件中的所有符号及其类型 Go当前的插件API不支持发现和使用未知插件。您必须了解插件并知道从中可以得到什么(包括导出符号的类型) 总有一天,API中可能会添加您正在查找的内容,但现在(Go 1.9.2)您只能使用这些内容 “黑客”偷看导出的符号 加载的插件由类型的值表示。这是指向包含符号表但未导出的结构的指针。如果您想“窥视”输出的符号,可以使用软件包打印 我将使用以下答案中的插件示例:,即: type plgFilter str

Golang plugin pkg仅支持按名称查找符号

如何扫描插件中的所有符号及其类型


Go当前的插件API不支持发现和使用未知插件。您必须了解插件并知道从中可以得到什么(包括导出符号的类型)

总有一天,API中可能会添加您正在查找的内容,但现在(Go 1.9.2)您只能使用这些内容

“黑客”偷看导出的符号 加载的插件由类型的值表示。这是指向包含符号表但未导出的结构的指针。如果您想“窥视”输出的符号,可以使用软件包打印

我将使用以下答案中的插件示例:,即:

type plgFilter struct{}

func (plgFilter) Name() string { return "Bob" }
func (plgFilter) Age() int     { return 23 }

func GetFilter() (f filter.Filter, err error) {
    f = plgFilter{}
    fmt.Printf("[plugin GetFilter] Returning filter: %T %v\n", f, f)
    return
}
它包含一个导出的符号:
GetFilter
函数。加载和打印此插件的符号表:

p, err := plugin.Open("pg/pg.so")
if err != nil {
    panic(err)
}

fmt.Printf("%+v\n", p)
我们可以在输出中“观察”导出的
GetFilter
符号:

&{pluginpath:pg loaded:0xc420020120 syms:map[GetFilter:0x7f0a7fddc860]}
此符号的关联值是一个内存地址,不是真正的对话地址

但我们还可以做更多的工作:我们可以使用package在查找后打印其类型:

GetFilter, err := p.Lookup("GetFilter")
if err != nil {
    panic(err)
}

fmt.Println(reflect.TypeOf(GetFilter))
现在我们来看看:

func() (filter.Filter, error)

我们看到它是一个有两种返回类型的函数:
filter.filter
error

谢谢@icza,这就是我需要的。