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