golang:如何卸载已加载的“go插件”1.8

2024-04-08

go1.8开始,go支持创建和加载插件。

但不支持卸载插件。

插件是在运行时加载的模块,是否可以卸载模块?

如果无法卸载模块,那么在应用程序级别卸载插件/使其不可用但仍在内存中的最佳方法是什么?


Go 不支持卸载插件。但您可以按照您的建议禁用它。通常,插件会定义一个包含插件信息的结构。您可以从具有众所周知名称的工厂函数返回此值(例如awesome.so包含AwesomePlugin)。您可以在结构中包含的项目之一是禁用对插件的访问的方法。你可以这样做:

type MyPlugin struct {
    Name string
    Enable func() error
    Disable func() error
}

然后在插件本身中你会做这样的事情:

var (
    awesomeEnabled bool
)

func AwesomePlugin() *myplugin.MyPlugin {
    return &myplugin.MyPlugin{
        Name: "AwesomePlugin",
        Enable: func() error {
            println("Enabling AwesomePlugin")
            awesomeEnabled = true
            return nil // or do something more complex that could error
        },
        Disable: func() error {
            println("Disabling AwesomePlugin")
            awesomeEnabled = false
            return nil // or do something more complex that could error
        },
    }
}

然后加载它、启用它和禁用它的代码将类似于:

awesomePlugin, err := plugin.Open("awesome.so")
if err != nil {
    panic("Can't load plugin: " + err.Error())
}

sym, err := awesomePlugin.Lookup("AwesomePlugin")
if err != nil {
    panic("Can't find symbol: " + err.Error())
}

awesomeFactory := sym.(func() *myplugin.MyPlugin)
awesome := awesomeFactory()

println("Loaded " + awesome.Name + " plugin")

err = awesome.Enable()
if err != nil {
    panic("Can't enable plugin: " + err.Error())
}

// Do some stuff

err = awesome.Disable()
if err != nil {
    panic("Can't enable plugin: " + err.Error())
}

在运行您可能定义的任何其他函数之前,您可以查看插件中的代码以查看该插件是否已启用。

然后,运行它,我们得到如下输出:

Loaded AwesomePlugin plugin
Enabling AwesomePlugin
Disabling AwesomePlugin

显然你不想panic()到处。这只是一个占位符,用于处理错误。

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

golang:如何卸载已加载的“go插件”1.8 的相关文章

  • 如何通过模板中的变量访问对象字段?

    我有一个嵌套循环 columns columns range dx dataList range c columns index dx c end end dataList是orm模型数组 和ID Title字段 那么columns is
  • ReverseProxy取决于golang中的request.Body

    我想构建一个 http 反向代理 它检查 HTTP 主体 然后将 HTTP 请求发送到它的上游服务器 你怎么能在 Go 中做到这一点 初始尝试 如下 失败 因为 ReverseProxy 复制传入请求 修改它并发送 但正文已被读取 func
  • Go中如何从json字符串中获取键值

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

    我想包装一个 C 函数 它需要一个char 指向非空字节缓冲区 的第一个元素 我正在尝试使用 CGo 将其包装在 Go 函数中 以便我可以将其传递给 byte 但我不知道如何进行转换 C 函数签名的简化版本是 void foo char c
  • XcodeColors 在 XCode 5 中不起作用

    我尝试安装XcodeColors在 XCode 5 中 但不幸的是 它不能与我从 XCode 4 6 获得的旧插件一起使用 下一步 我检查了 github 网站 在那里我看到了以下拉取请求 提供了 XCode 5 的工作版本 https g
  • Javascript图像编辑插件

    在哪里可以找到 Javascript 或 jQuery 图像编辑器插件 用户可以单击图像进行编辑 并且该插件允许他们进行裁剪 调整大小 旋转 翻转等 Pixastic http pixastic com lib 不再活跃 和CamanJS
  • FileReader 在 Ionic 2 中未触发 onloadend

    我正在尝试使用 cordova file plugin 读取本地文件 目前我可以读取本地目录的内容并选择单个文件 但我在获取文件内容时遇到问题 这是我的函数 从列表中选择文件后单击按钮即可调用该函数 import window resolv
  • Go io.Pipe 的缓冲版本

    有缓冲版本吗io Pipe https golang org pkg io Pipe 在标准库或第三方库中 在我推出自己的库之前 上下文 我正在尝试使用这个解决方案 https stackoverflow com a 36229262 15
  • 如何分析 VSCode 中函数的性能

    我用 C Golang 编写了一个程序 如何找到占用最高 CPU 周期的函数 目的是提高正在执行的程序的性能 2021 年 10 月 金香儿哈娜 https github com hyangah宣布 tweet https twitter
  • 如何将UTC时间转换为unix时间戳

    我正在寻找将 UTC 时间字符串转换为 unix 时间戳的选项 我的字符串变量是02 28 2016 10 03 46 PM并且需要将其转换为 unix 时间戳 例如1456693426 知道该怎么做吗 首先 unix时间戳14566934
  • 任何插件安装失败 - 无法复制文件错误

    每次我安装一个新的 WordPress 插件时 它都会说无法复制文件和文件地址 有谁知道为什么会这样 我遇到了同样的问题 但就我而言 我是使用 FTP 进行更新 我通过将主机名设置为 localhost 而不是使用 IP 来修复此问题 这是
  • 使用 HTTPS GRC 从 AWS Codecommit 获取私有存储库

    我正在尝试导入位于 AWS codecommit 中的模块 为了克隆存储库 我使用 HTTPS GRC Git 远程代码提交 方法 该方法使用 Google Suite 凭证来访问 AWS 控制台 我用来克隆存储库的命令是 git clon
  • 如何在 Go 中将环境变量传递给测试用例

    在为 Go 编写测试用例时 传递需要提供给测试的环境变量的标准方法是什么 例如 我们不想在测试用例的源代码中嵌入密码 处理这个问题最标准的方法是什么 我们让测试用例寻找配置文件吗 还有别的事吗 看来我偶然发现了答案 将其添加到测试用例中可以
  • 解组转义 XML

    在 Go 中 我将如何解码此 XML 响应 我尝试过建立一个自定义UnMarshal方法在我的Answerstruct 但我运气不太好
  • 打印到 stdout 会导致阻塞的 goroutine 运行吗?

    作为一个愚蠢的基本线程练习 我一直在尝试实现理发师睡觉的问题 http en wikipedia org wiki Sleeping barber problem在戈兰 对于通道来说 这应该很容易 但我遇到了一个 heisenbug 也就是
  • 为什么我不能将左大括号放在下一行?

    当我尝试编译以下代码时遇到奇怪的错误 package main import fmt fmt func main var arr 3 int for i 0 i lt 3 i fmt Printf d arr i 错误如下 unexpect
  • 正确的文件扩展名或缩写是什么。 golang 的文本/模板?

    我正在考虑为其创建语法荧光笔 但我不知道这种特定类型模板的常规缩写 In 例子之一 http golang org pkg text template example Template helpers从文本 模板 godoc 中 它们引用
  • 如何使信号量超时

    Go 中的信号量是通过通道来实现的 一个例子是这样的 https sites google com site gopatterns concurrency semaphores https sites google com site gop
  • Android PhoneGap 插件,UI 选项卡栏,调整 WebView 大小

    我正在创建一个美味的 PhoneGap 插件 希望一旦它能被打开 准备好了 插件基本完成了 我只需要一个漂亮的用户界面 相互作用 简而言之 我想创建一个 本机 android 工具栏组件 如果您实现 PhoneGap UIControls
  • Golang中按长度分割字符串

    有谁知道如何在 Golang 中按长度分割字符串 例如 每 3 个字符分割 helloworld 那么理想情况下它应该返回一个 hel low orl d 数组 或者 一个可能的解决方案是在每 3 个字符后附加一个换行符 所有的想法都非常感

随机推荐

  • 在 EMR 中引导期间获取“现有锁 /var/run/yum.pid:另一个副本正在作为 pid 运行...”

    我需要在我的 EMR 集群 AMI 3 1 1 中安装 python3 作为引导步骤的一部分 所以我添加了以下命令 sudo yum install y python3 但每次我都会收到以下错误 Existing lock var run
  • 有没有一种简单的方法来打开 Uri 并获取它指向的任何内容? (C#)

    我有一个Uri对象被传递给我的类的构造函数 我想打开文件Uri指向 无论是本地 网络 http 还是其他 并将内容读入字符串 有没有一种简单的方法可以做到这一点 或者我是否必须尝试解决诸如Uri IsFile弄清楚如何尝试打开它 stati
  • 如何使用 Teams Webhooks 发布多行消息?

    我有一个 webhook 设置 可以将消息发布到我们的 Teams 团队频道之一 我正在使用此处给出的团队 Webhook 示例之一 https learn microsoft com en us microsoftteams platfo
  • 推荐的 Ruby 交互式控制台 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 Mailkit 或 mimekit 向多个收件人发送一封电子邮件

    请不要将其标记为重复问题 因为该解决方案适用于邮件消息 而不适用于 mailkit 我正在尝试向多个地址发送电子邮件 我尝试使用下面的代码 但我还没有尝试使用循环 var message new MimeMessage message Fr
  • 如何全局禁用 Pylint 特定错误消息?

    我使用 Sublime Text 编辑器和 Pylint 作为 Python 代码解析器 它工作正常 但是每当我定义变量时 我都会收到以下错误消息 C0103 错误 常量名称无效 I read 在这个主题中 https stackoverf
  • 在 Visual Studio 2012 中导入现有源文件

    我想将教程的源代码添加到现有项目中 并且希望将文件从下载到的桌面上的临时文件复制到项目文件夹中 在解决方案资源管理器中单击 源文件 文件夹会引导我进入 添加 gt 现有项目 菜单 然后我可以添加源文件 但是 它不会复制到项目文件夹中 而是保
  • 如何将 Vec 转换为 C 友好的 *mut T?

    我有一个 Rust 库 它返回u8通过 FFI 将数组传递给 C 调用者 该库还可以在客户端使用完数组后处理删除数组的问题 库没有状态 因此客户端需要拥有该数组 直到将其传回库进行释放 Using box from raw and boxe
  • Erlang 生成问题

    我在 erlang 中遇到了 spawn 问题 似乎进程在一段时间后就死掉了 这是简单的代码 module simple export server 1 client 1 owner 1 spawn n 2 start 1 main 1 s
  • javax.xml.bind.JAXBException:不包含 ObjectFactory.class o jaxb.in​​dex

    我有一个 Java Spring Web 应用程序 需要将其用作 SOAP 客户端 我正在使用 Maven 并且有一个包含自定义代码的主模块 WAR 和一个包含 WSDL 我有两个 WSDL 生成的类的子模块 JAR 依赖项 正如您在标题中
  • LsaOpenPolicy 在我的代码中抛出异常。为什么?

    我从新闻组帖子中得到了以下代码 奇怪的是 它在 Delphi 2010 中对我不起作用 LsaOpenPolicy 函数调用时抛出异常 function AddLogonAsAService ID pchar boolean const R
  • 是否可以将批量搜索请求发送到 Google 自定义搜索 API?

    我的应用程序超出了 Google 自定义搜索 API 的限制 在寻求优化我的搜索调用时 我想知道是否有办法批量发送到 API 的搜索请求 我有一些页面 每个用户搜索都会发出多个请求 并且希望将它们批处理为一个 API 调用 我环顾四周 但没
  • 在 React 中的按键上应用按钮“活动”样式

    我在 React Redux 中有一个鼓应用程序 它的功能齐全 但我希望能够在相应的按键按下时应用活动按钮样式 就像我物理单击按钮时一样 就目前情况而言 单击按钮会进行转换 但键入相应的键只会播放音频文件 而不会真正链接到按钮 有没有办法在
  • 如何以 RESTful 方式建模 CANCEL 操作?

    我们目前正在从我们的整体服务中争取较小的服务 我们的域与票务系统非常相似 我们决定开始域名的取消流程 我们的取消服务有一个简单的端点 Cancel 它接收票证的 ID 在内部 我们检索 id 对其执行一些与取消相关的操作 并更新存储中实体的
  • 使用 jquery 将字符串与数字分割[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有类似的字符串 1 test one 2 test two 3 test three 4 test four 5 test five
  • Xcode 中出现错误“未设置视图出口。”

    我在 Xcode 中遇到问题 每次我在模拟器中运行我的应用程序时 该应用程序都会在黑屏视图中停止 并且调试器会编写以下代码 2012 07 04 11 54 08 348 myApp 661 f803 由于以下原因终止应用程序 未捕获的异常
  • Laravel 5 - 未找到 Application::shutdown() 函数,是否有其他解决方案?

    出现致命错误 在 laravel 5 中调用未定义的方法 Illuminate Foundation Application shutdown 代码示例 App shutdown function do somthing 使用 Larave
  • 在进行 Rails asset:precompile 时如何运行一些初始化程序?

    背景 我有一个应用程序 最近更新到了 Rails 3 2 1 从 Rails 3 0 x 并重构了 JS 和 CSS 资源以利用新的资源管道 该应用程序托管在具有 Celadon Cedar 堆栈的 Heroku 上 应用程序配置 我将应用
  • EF4 仅代码映射继承

    我有以下型号 我想要ShiftRequest and MissionRequest在数据库中有一个表 public class RequestBase public int Id get set public DateTime Reques
  • golang:如何卸载已加载的“go插件”1.8

    go1 8开始 go支持创建和加载插件 但不支持卸载插件 插件是在运行时加载的模块 是否可以卸载模块 如果无法卸载模块 那么在应用程序级别卸载插件 使其不可用但仍在内存中的最佳方法是什么 Go 不支持卸载插件 但您可以按照您的建议禁用它 通