我正在用golang对我的项目进行编码。我想像插件编程一样设计我的项目,但我把golang搞混了。我的项目有数据分析任务,我的目的是制作一个包含模块分析的文件夹,如果之后我有新的模块,我只需要将它复制到文件夹中,主应用程序会将数据原封不动地传递给新的模块。你能帮帮我吗?感谢您的收看!
发布于 2016-12-08 17:13:53
使用它的接口构建可插拔的东西是一个很好的选择。
接口
Go中的接口是一种类型抽象方式。
Go中的
接口提供了一种指定对象行为的方法:如果某个东西可以做到这一点,那么它就可以在这里使用。
这意味着一件简单但非常强大的事情--你可以使用不同的复合文字作为接口类型,如果它们实现了接口的话。这已经是一个可插拔的系统,如果你正在寻找一些简单的东西,它可以用最少的努力来构建。
最简单的实现
假设你有这样一个原始的架构:
▾ pluggable/
▾ app/
pusher.go
▾ plugins/
green_button.go
plugin_interface.go
red_button.go
main.go plugins/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)
} plugins/red_button.go
还有一个插件..。
package plugins
import (
"fmt"
)
type RedButton struct {
Err error
}
func (b RedButton) Push() {
fmt.Println(b.Err)
} app/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()
} 您可以添加更多的糖,例如多一个隔离级别,以使用配置为一个或另一个特定实现的单个按钮,依此类推。
作为库的插件
plugin-libraries也有同样的技巧。plugin-libraries中声明的复合文本必须实现主应用程序的plugin接口。但在这种情况下,您将需要一个注册函数和一个带有libs导入的文件,因此它看起来已经像一个nano插件框架。
发布于 2016-12-07 20:35:07
Go 1.8支持插件:https://beta.golang.org/pkg/plugin/。如果你可以等几个月,你可以使用它(或者只使用beta 1.8)。
https://stackoverflow.com/questions/41008918
复制相似问题