Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop golang上的插件编程_Oop_Go_Plugins - Fatal编程技术网

Oop golang上的插件编程

Oop golang上的插件编程,oop,go,plugins,Oop,Go,Plugins,我正在用golang编写我的项目。我想像插件编程一样设计我的项目,但我把golang搞糊涂了。我的项目有数据分析任务,我专门制作了一个包含模块分析的文件夹,如果我以后有了新模块,我只需要将其复制到文件夹中,主应用程序就会将数据传递到新模块,而无需修改。 你能帮助我吗?谢谢收看 Go 1.8支持插件:。如果你可以等几个月,你可以使用它(或者只使用beta 1.8)。使用它的接口是构建可插拔产品的好选择 接口 Go中的接口是类型抽象的一种方式 Go中的接口提供了一种指定对象行为的方法:如果有什么东西

我正在用golang编写我的项目。我想像插件编程一样设计我的项目,但我把golang搞糊涂了。我的项目有数据分析任务,我专门制作了一个包含模块分析的文件夹,如果我以后有了新模块,我只需要将其复制到文件夹中,主应用程序就会将数据传递到新模块,而无需修改。
你能帮助我吗?谢谢收看

Go 1.8支持插件:。如果你可以等几个月,你可以使用它(或者只使用beta 1.8)。

使用它的接口是构建可插拔产品的好选择

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

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

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

最简单的实现 假设您有这样一个原始的体系结构:

▾ pluggable/       
  ▾ app/           
      pusher.go    
  ▾ plugins/       
      green_button.go   
      plugin_interface.go
      red_button.go   
    main.go        
插件/插件接口。转到

将用作插件类型抽象的接口

package plugins        

type Button interface {
    Push()             
}                     
插件/绿色按钮。转到

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

package plugins              

import (                     
    "fmt"                    
)                            

type GreenButton struct {    
    Msg string               
}                            

func (b GreenButton) Push() {
    fmt.Println(b.Msg)       
}                            
插件/红色按钮。转到

还有一个插件

package plugins            

import (                   
    "fmt"                  
)                          

type RedButton struct {    
    Err error              
}                          

func (b RedButton) Push() {
    fmt.Println(b.Err)     
}                          
app/pusher.go

嵌入在复合文字中的接口类型。实现接口的任何cl都可以在
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插件框架。

不幸的是,目前在Go中几乎不支持动态共享库加载。这可能是支持所描述的功能所需要的。(我已经尝试过大量滥用运行时来欺骗它这么做,但至少出于几个原因,这是不可能的。)您可能可以玩一些游戏,将每个模块作为单独的进程运行,在应用程序初始化时动态启动,并与IPC协调,但对我来说,这听起来不是一个伟大的设计…你可以尝试这种方法。每个插件都只是一个静态二进制文件,插件和主机就像客户端/服务器一样与RPC通信。谢谢!我将在我的设计中尝试RPC。嵌入Lua之类的东西怎么样?您的插件可以用Lua编写--