答案 0 :(得分:2)
Go的当前插件API不支持发现和使用未知插件。您必须知道该插件并知道该如何(包括导出符号的类型)。
有一天,您可能会在API中添加您想要的内容,但就目前而言(Go 1.9.2),您只能使用Plugin.Lookup()
。
加载的插件由类型*plugin.Plugin
的值表示。这是一个指向包含符号表的结构的指针,但它不会被导出。如果您想“查看”导出的符号,可以使用fmt
包进行打印。
我将使用此答案中的插件示例:go 1.8 plugin use custom interface,即:
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]}
此符号的关联值是一个内存地址,而不是真正的健谈。
但是我们可以做得更多:我们可以在查看之后使用包reflect
来打印它的类型:
GetFilter, err := p.Lookup("GetFilter")
if err != nil {
panic(err)
}
fmt.Println(reflect.TypeOf(GetFilter))
现在我们会看到:
func() (filter.Filter, error)
我们看到它是一个有两种返回类型的函数:filter.Filter
和error
。