golang 从插件中导出所有符号

2023-12-08

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

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

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


Go当前的插件API不支持发现和使用未知插件。你必须know插件和知道会发生什么来自它(包括导出符号的类型)。

有一天,API 可能会针对您正在寻找的内容进行添加,但目前(Go 1.9.2)您只能使用Plugin.Lookup() only.

“Hack”查看导出的符号

加载的插件由 type 的值表示*plugin.Plugin。这是指向包含符号表的结构的指针,但未导出。如果您想“查看”导出了哪些符号,您可以使用fmt打包打印它。

我将使用此答案中的插件示例:go 1.8插件使用自定义接口,即:

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]}

这个符号的关联值是一个内存地址,不太多说。

但我们可以做更多:我们可以使用 packagereflect在我们查找之后打印它的类型:

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

fmt.Println(reflect.TypeOf(GetFilter))

现在我们会看到:

func() (filter.Filter, error)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang 从插件中导出所有符号 的相关文章

  • 在 EXCEL 中使用多个表的条件求和

    我有一个表 我试图根据两个参考表的值来填充该表 我有各种不同的项目 类型 1 类型 2 等 每个项目运行 4 个月 并且根据其生命周期的不同时间 花费不同的金额 这些成本计算显示在Ref Table 1 参考表1 Month a b c d
  • 在 Go 中使用互斥锁

    我想了解互斥体是如何工作的 据我目前的理解 它是为了进行原子操作并同步对某些数据的访问 我在这里构建了一个队列数据结构的示例 https github com arnauddri algorithms blob master data st
  • Go中如何从json字符串中获取键值

    我想尝试从 Go 中的 JSON 获取键值 但我不确定如何操作 我已经能够使用 simplejson 读取 json 值 但是我无法找到如何获取键值 有人能指出我正确的方向和 或帮助我吗 谢谢你 您可以通过执行以下操作来获取 JSON 结构
  • 初始化嵌套匿名结构

    我有一个 json 作为 fields time id status customerId additionalDetail pageInfo start 0 rows 1000 我想将我的结构编组到上面的 json 并创建如下结构 typ
  • Go中如何自定义http.Client或http.Transport超时重试?

    我想实现一个自定义http Transport对于标准http Client 如果客户端超时 它将自动重试 附 由于某种原因 习俗http Transport is a 一定有 我已经查过了hashcorp go retryablehttp
  • 为什么奇数的切片容量与偶数的切片行为不同

    我注意到 当容量为奇数时 切片的容量会以不同的方式表现 更具体地说 当向切片添加元素时 切片的容量为doubled当原始容量为偶数时 但当原容量为奇数时 容量为增加一 然后加倍 例子 s make int 28 28 s append s
  • Go io.Pipe 的缓冲版本

    有缓冲版本吗io Pipe https golang org pkg io Pipe 在标准库或第三方库中 在我推出自己的库之前 上下文 我正在尝试使用这个解决方案 https stackoverflow com a 36229262 15
  • for 循环初始值设定项中的结构

    知道为什么 for 循环初始值设定项中的这个结构表达式在编译时会出现语法错误吗 在这种情况下 指向结构的指针工作正常 但 ofc 我需要如下所示的局部变量 感谢您的建议 type Request struct id int line byt
  • 以编程方式检查 .class 文件是否扩展特定类

    我有一个问题 我已经尝试解决好几个小时了 在 Eclipse 插件中 我有一个 ArrayList 其中包含一些 java class 文件的完整路径 作为字符串 我想做的是检查列表中包含的类是否扩展了特定的类 我考虑过解析该文件 查找 e
  • 如何在运行“go test”时排除或跳过特定目录[重复]

    这个问题在这里已经有答案了 go test go list grep v vendor coverprofile testCoverage txt 我正在使用上述命令来测试文件 但有 1 个名为 Store 的文件夹我想从测试中排除 怎样才
  • 有没有办法在 VSCode 中保存时运行 go 测试,并将其输出到终端?

    现在我有几个项目在VSCode中运行 运行起来相当繁琐go test每次我编写新代码时 我宁愿立即看看我是否破坏了某些东西 我知道在 Javascript 中我可以在每次保存文件时运行测试 并将输出发送到终端 现在我正在使用 保存时运行 h
  • 任何插件安装失败 - 无法复制文件错误

    每次我安装一个新的 WordPress 插件时 它都会说无法复制文件和文件地址 有谁知道为什么会这样 我遇到了同样的问题 但就我而言 我是使用 FTP 进行更新 我通过将主机名设置为 localhost 而不是使用 IP 来修复此问题 这是
  • 在 Go 中初始化嵌入结构

    我有以下内容struct其中包含一个net http Request type MyRequest struct http Request PathParams map string string 现在我想初始化匿名内部结构http Req
  • 如何将 int[] 转换为 uint8[]

    所以 我需要你的帮助 我找不到关于该主题的任何内容 Golang 是一门刚刚诞生的语言 所以对于像我这样的新手来说很难快速找到答案 预先声明的 Goint类型大小是特定于实现的 32 位或 64 位 数字类型 http golang org
  • 如何将 Unicode 字符转换为简单形式? [复制]

    这个问题在这里已经有答案了 有没有一个Go库可以Sj str m作为输入和返回Sjostrom作为输出 您可以使用golang org x text unicode norm来处理这个问题 package main import fmt i
  • 复杂数据类型作为 Go 中映射的键

    我正在尝试在 Go 中创建一个由大整数作为键的映射 effective Go 明确指出 结构体 数组和切片不能用作映射键 因为这些类型上没有定义相等性 这是有道理的 我当然可以将大整数转换为字符串并使用字符串作为键 但我在这里寻找更通用的解
  • 有队列实现吗?

    任何人都可以建议使用 Go 容器来实现简单快速的 FIF 队列 Go 有 3 种不同的容器 heap list and vector 哪一种更适合实现队列 事实上 如果您想要的是一个基本且易于使用的 fifo 队列 slice 可以满足您所
  • Android PhoneGap 插件,UI 选项卡栏,调整 WebView 大小

    我正在创建一个美味的 PhoneGap 插件 希望一旦它能被打开 准备好了 插件基本完成了 我只需要一个漂亮的用户界面 相互作用 简而言之 我想创建一个 本机 android 工具栏组件 如果您实现 PhoneGap UIControls
  • “go.tools”的权限被拒绝错误

    当我尝试安装 go 工具时 我的权限被拒绝 usr local go pkg tool linux amd64 cover 我可以接受 因为它是 usr local 目录及需求root使用权 但我的第一个疑问是为什么当我设置时它试图安装在这
  • 直接从一个通道发送到另一个通道

    当从一个通道直接发送到另一个通道时 我偶然发现了令人惊讶的行为 package main import fmt func main my chan make chan string chan of chans make chan chan

随机推荐

  • 未知服务错误 botocore

    我正在尝试使用最近的亚马逊转录服务 transcribe boto3 client transcribe 我收到以下错误 botocore exceptions UnknownServiceError Unknown service tra
  • 创建独立进程!

    我正在尝试从 C 中的服务创建一个进程 这个新进程是作为子进程创建的 我想创建一个独立的进程而不是子进程 我正在使用 CreateProcess 函数来实现相同的目的 由于我创建的新进程是一个子进程 当我尝试在服务级别杀死进程树时 它也会杀
  • CSS中的梯形div

    我想要内容为梯形的部分div但我不知道如何开始或实现我的目标的最佳方法是什么 我遇到过这个解决方案 但没有太多信息可供我理解CSS3 转换为梯形 HTML div class section p content here p div 这是创
  • 在固定大小的大正方形中创建动态等大小的小正方形网格

    我怎样才能在固定的大正方形内创建动态的等大小的正方形 尺寸应根据正方形的数量 这将是最通用的解决方案 使用CSSgrid根据子元素的总和 可计算列和行 JS解释 grid children length 计算以下孩子的数量grid div
  • 并发 hashmap 不需要同步 getter/setter 吗?

    如果我使用并发哈希图并且我有设置和获取值的方法 因为我使用并发哈希图 我需要使 getter 和 setter 同步吗 这是多余的吗 有一种设计更好吗 另外 没有同步的并发哈希图是否比具有同步 getter 和 setter 的哈希图更快
  • 全屏模式下 JDialog 不显示

    我有一个在全屏模式下运行的应用程序并且运行良好 现在我需要添加一个简单的 未修饰的对话框 但我遇到了麻烦 如果我运行应用程序最大化但不是全屏 对话框会按预期显示和运行 当我切换回全屏时 该对话框将不会显示 该对话框扩展了 JDialog 仅
  • php tree ul li 数组中的层次结构菜单

    我们从 mysqli 查询输出中得到这个数组 items Array Array id gt 1 title gt menu1 parent id gt 0 Array id gt 2 title gt submenu1 1 parent
  • 查找版本并使用 Cleartool 删除它

    我正在尝试从特定分支递归删除某些版本 文件 find提供正确的文件 现在取决于rmver删除版本但这给了我一个错误 我正在为语法而苦苦挣扎 cleartool gt find Component Test element brtype P
  • 关闭hadoop HDFS后数据丢失?

    你好 我正在学习hadoop 我有一个简单的愚蠢问题 在我关闭HDFS 通过调用hadoop home sbin stop dfs sh 后 HDFS上的数据丢失了还是可以恢复 如果您停止 HDFS 数据不会丢失 只要您将 NameNode
  • 如何在Python函数中执行QWebEngine

    我有一个 WebEngine 类来读取网页并为它们创建 BeautifulSoup 这是代码 import sys from bs4 import BeautifulSoup import os from PyQt5 import QtCo
  • 为什么赋值中左侧的表达式并不总是有效?

    这段代码的工作原理 let foo foo bar console log foo 这让我相信任何表达式都可以作为赋值的左侧 但是 此代码不起作用 let foo1 bar let foo2 let foo3 foo1 foo2 foo3
  • 应用脚本 G Suite 用户的电子邮件配额

    这是我在谷歌表单中使用的简单应用程序脚本 function onFormSubmit event var x MailApp getRemainingDailyQuota 我刚刚注册了 G Suite 免费试用版 此链接提到 G Suite
  • 没有默认构造函数的对象数组初始化

    include
  • C# -- TcpListener.Start() 导致 SocketException 并显示消息“每个套接字地址仅使用一次”

    我有一个服务 当它出现时 它会调用 TcpListener 实例上的 Start 方法 此侦听器使用的端口不常见且未被任何其他服务使用 很少有人会在几分钟左右的时间里遇到奇怪的错误 一分钟内 服务 发生故障时立即重新启动 因以下异常而连续崩
  • 如何在 GitLab 的服务器端添加预接收钩子?

    我试图限制在我们的 gitlab 中提交的二进制文件 EXE DLL PDF 所以我需要添加钩子来将其限制在全局范围内 我怎样才能做到这一点 Pre receive hook 适合这个吗 这个地方添加钩子是否正确 opt gitlab em
  • Visual Studio TypeScript 保存时编译失败,“项目包含错误”但没有显示错误?

    我有一个网络项目 保存时编译 运行完美近一年 然后我改用 npm 并node modules types而不是通过 NuGet 的 Typescript 定义包 因此 现在我使用 tsconfig json 来控制 项目 中包含的 Type
  • cmd找不到mvn命令

    我刚刚安装了 Maven 并添加了 binmaven 目录到我的路径变量 当我尝试使用mvn命令提示符中的命令我刚刚收到一条消息 mvn 找不到命令 我在这里找到的其他所有内容都没有帮助 Edit I used https maven ap
  • 将 URL 从 /ch-de/ 重定向到 /de/ 并使用 ? 重定向 URL和 &

    互联网研究对我没有帮助 所以我拼命向社区寻求答案 问题是 我们已将网上商店从 Joomla Virtuemart 转移到 PrestaShop 现在我们遇到了重定向 URL 的问题 例如 htaccess 中的以下语法不起作用 重定向 30
  • NPM 安装在 loadRequestedDeps 上挂起

    当我使用 NPM 下载任何包时 它会挂在最后一个命令 loadRequestedDeps 上 我已经添加了我的全部 verbose输出到这个问题的末尾以供参考 它会一直坐在那里 直到我取消命令 并且不会安装任何内容 并且我的 package
  • golang 从插件中导出所有符号

    Golang 插件 pkg 仅支持按名称查找符号 如何扫描插件中的所有符号及其类型 https golang org pkg plugin Go当前的插件API不支持发现和使用未知插件 你必须know插件和知道会发生什么来自它 包括导出符号