golang上的插件编程

时间:2016-12-07 03:28:59

标签: oop go plugins

我用golang编写项目代码。我想设计我的项目,如插件编程,但我与golang混淆。我的项目有数据分析任务,我的目的是创建一个包含模块分析的文件夹,如果我之后有新的模块,我只需将其复制到文件夹,主应用程序将数据传递给新模块而不进行修改。 你能帮助我吗?谢谢观看!

2 个答案:

答案 0 :(得分:2)

使用它的界面是构建可插拔内容的不错选择。

接口

Go中的接口是一种类型抽象的方式。

  

Go中的接口提供了一种指定对象行为的方法:如果有什么可以做到这一点,那么可以在这里使用它。

它意味着一个简单但非常强大的东西 - 如果它们实现了接口,您可以使用不同的复合文字作为接口类型。这已经是一个可插拔的系统,如果正在寻找简单的东西,可以用最小的努力来构建。

最简单的实施

假设你有这样一个原始架构:

▾ pluggable/       
  ▾ app/           
      pusher.go    
  ▾ plugins/       
      green_button.go   
      plugin_interface.go
      red_button.go   
    main.go        

<强>插件/ plugin_interface.go

一个接口,将用作插件的类型抽象。

package plugins        

type Button interface {
    Push()             
}                     

plugins / green_button.go

现在可以使用插件扩展应用程序实现接口。

package plugins              

import (                     
    "fmt"                    
)                            

type GreenButton struct {    
    Msg string               
}                            

func (b GreenButton) Push() {
    fmt.Println(b.Msg)       
}                            

<强>插件/ red_button.go

另一个插件......

package plugins            

import (                   
    "fmt"                  
)                          

type RedButton struct {    
    Err error              
}                          

func (b RedButton) Push() {
    fmt.Println(b.Err)     
}                          

应用/ pusher.go

嵌入在复合文字中的接口类型。实现该接口的任何cl都可以在Pusher实例中使用。 Pusher并不关心它只是推送的特定插件实现。它被很好地抽象和封装。

package app                            

import (                               
    "github.com/I159/pluggable/plugins"
)                                      

type Pusher struct {                   
    plugins.Button                     
}                                      

<强> main.go

使用所有东西。

package main                                                                

import (                                                                    
    "errors"                                                                
    "github.com/I159/pluggable/app"                                         
    "github.com/I159/pluggable/plugins"                                     
)                                                                           

func main() {                                                               
    alert_pusher := app.Pusher{plugins.RedButton{Err: errors.New("Alert!")}}
    success_pusher := app.Pusher{plugins.GreenButton{Msg: "Well done!"}}    

    alert_pusher.Push()                                                     
    success_pusher.Push()                                                   
}                                                                           

您可以添加更多糖,例如一个更高级别的隔离,以使用配置为一个或另一个特定实现的单个按钮,等等。

插件作为库

与插件库相同的技巧。在插件库中声明的复合文字必须实现主应用程序的插件接口。但在这种情况下,你需要一个函数寄存器和一个libs导入文件,所以它看起来像一个nano插件框架。

答案 1 :(得分:1)

Go 1.8支持插件:https://beta.golang.org/pkg/plugin/。如果你可以等几个月就可以使用它(或者只使用beta 1.8)。