golang 从插件中导出所有符号
golang export all symbols from a plugin
Golang 插件 pkg 仅支持按名称查找符号。
如何扫描插件中的所有符号及其类型?
Go的当前插件API不支持发现和使用未知插件。您必须了解 插件并且知道 可以从中得到什么(包括导出符号的类型)。
有一天,API 可能会添加您正在查找的内容,但现在(Go 1.9.2)您只能使用 Plugin.Lookup()
。
"Hack" 查看导出的符号
加载的插件由 *plugin.Plugin
. This is a pointer to a struct which contains the symbol table, but it's not exported. If you want to take a "peek" at what symbols are exported, you may use the 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
函数。加载并打印此插件的符号table:
p, err := plugin.Open("pg/pg.so")
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", p)
我们可以在输出中"observe"导出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)
我们看到它是一个具有 2 return 类型的函数:filter.Filter
和 error
。
Golang 插件 pkg 仅支持按名称查找符号。
如何扫描插件中的所有符号及其类型?
Go的当前插件API不支持发现和使用未知插件。您必须了解 插件并且知道 可以从中得到什么(包括导出符号的类型)。
有一天,API 可能会添加您正在查找的内容,但现在(Go 1.9.2)您只能使用 Plugin.Lookup()
。
"Hack" 查看导出的符号
加载的插件由 *plugin.Plugin
. This is a pointer to a struct which contains the symbol table, but it's not exported. If you want to take a "peek" at what symbols are exported, you may use the 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
函数。加载并打印此插件的符号table:
p, err := plugin.Open("pg/pg.so")
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", p)
我们可以在输出中"observe"导出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)
我们看到它是一个具有 2 return 类型的函数:filter.Filter
和 error
。