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