首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >golang上的插件编程

golang上的插件编程
EN

Stack Overflow用户
提问于 2016-12-07 11:28:59
回答 2查看 1.3K关注 0票数 1

我正在用golang对我的项目进行编码。我想像插件编程一样设计我的项目,但我把golang搞混了。我的项目有数据分析任务,我的目的是制作一个包含模块分析的文件夹,如果之后我有新的模块,我只需要将它复制到文件夹中,主应用程序会将数据原封不动地传递给新的模块。你能帮帮我吗?感谢您的收看!

EN

回答 2

Stack Overflow用户

发布于 2016-12-08 17:13:53

使用它的接口构建可插拔的东西是一个很好的选择。

接口

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

Go中的

接口提供了一种指定对象行为的方法:如果某个东西可以做到这一点,那么它就可以在这里使用。

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

最简单的实现

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

代码语言:javascript
复制
▾ pluggable/       
  ▾ app/           
      pusher.go    
  ▾ plugins/       
      green_button.go   
      plugin_interface.go
      red_button.go   
    main.go        

plugins/plugin_interface.go

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

代码语言:javascript
复制
package plugins        

type Button interface {
    Push()             
}                     

plugins/green_button.go

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

代码语言:javascript
复制
package plugins              

import (                     
    "fmt"                    
)                            

type GreenButton struct {    
    Msg string               
}                            

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

plugins/red_button.go

还有一个插件..。

代码语言:javascript
复制
package plugins            

import (                   
    "fmt"                  
)                          

type RedButton struct {    
    Err error              
}                          

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

app/pusher.go

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

代码语言:javascript
复制
package app                            

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

type Pusher struct {                   
    plugins.Button                     
}                                      

main.go

所有东西的用法。

代码语言:javascript
复制
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()                                                   
}                                                                           

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

作为库的插件

plugin-libraries也有同样的技巧。plugin-libraries中声明的复合文本必须实现主应用程序的plugin接口。但在这种情况下,您将需要一个注册函数和一个带有libs导入的文件,因此它看起来已经像一个nano插件框架。

票数 2
EN

Stack Overflow用户

发布于 2016-12-07 20:35:07

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41008918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档