2017-04-12 86 views
1

go1.8以上,go支持創建並加載插件。golang:如何卸載已經加載的「go插件」1.8

但不支持卸載插件。

插件是在運行時加載的模塊,是否可以卸載模塊?

如果無法卸載模塊,在應用程序級別可以完成卸載插件的最佳做法/使其不可用,但仍在內存中?

+0

對於標題感到抱歉,所以強迫我多次修改它,因爲它不符合質量標準 – weima

+0

您無法「卸載」插件。你可以以某種方式版本插件,所以你可以每次加載新的插件? – JimB

+0

爲什麼不向你的插件添加一個Unload函數? –

回答

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()無處不在。這只是一個用於處理錯誤的佔位符。