gpt4 book ai didi

golang 从插件中导出所有符号

转载 作者:IT王子 更新时间:2023-10-29 01:38:28 26 4
gpt4 key购买 nike

Golang 插件 pkg 只支持按名称查找符号。

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

https://golang.org/pkg/plugin/

最佳答案

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)

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

关于golang 从插件中导出所有符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47031958/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com