1
go1.8以上,go支持創建並加載插件。golang:如何卸載已經加載的「go插件」1.8
但不支持卸載插件。
插件是在運行時加載的模塊,是否可以卸載模塊?
如果無法卸載模塊,在應用程序級別可以完成卸載插件的最佳做法/使其不可用,但仍在內存中?
go1.8以上,go支持創建並加載插件。golang:如何卸載已經加載的「go插件」1.8
但不支持卸載插件。
插件是在運行時加載的模塊,是否可以卸載模塊?
如果無法卸載模塊,在應用程序級別可以完成卸載插件的最佳做法/使其不可用,但仍在內存中?
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()
無處不在。這只是一個用於處理錯誤的佔位符。
對於標題感到抱歉,所以強迫我多次修改它,因爲它不符合質量標準 – weima
您無法「卸載」插件。你可以以某種方式版本插件,所以你可以每次加載新的插件? – JimB
爲什麼不向你的插件添加一個Unload函數? –