golang:如何卸载已经加载的" go plugin" 1.8

时间:2017-04-12 16:43:33

标签: go plugins

go1.8以后,去支持创建和加载插件。

但不支持卸载插件。

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

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

1 个答案:

答案 0 :(得分:0)

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()。这只是一个占位符,用于处理错误。