我对Go相当陌生,我很好奇是否有一个可扩展应用程序的既定设计模式。
例如,在我的源代码中,我有一个扩展目录,在那里我为我的程序放置不同的应用程序特定的扩展。我目前加载每个在我的主函数单独的名称。我想有程序自动包括我的扩展时,它被编译。
只是为了清楚,我不是试图在运行时动态加载扩展。我只是想使添加一个扩展程序一样简单,如:
- 将文件放入扩展名文件夹
- 编译
如果这在Go中是不可能的,那么我会做出应有的,但我只是在想必须有一个更好的方法来做到这一点。
为了更清楚地展示我想简化的内容,下面是我现在所做的一个示例:
main.go
package main
import (
"github.com/go-martini/martini"
"gopath/project/extensions"
)
func main() {
app := martini.Classic()
// Enable Each Extension
app.Router.Group("/example", extensions.Example)
// app.Router.Group("/example2", extensions.Example2)
// ...
app.Run()
}
扩展/example.go
package extensions
import (
"github.com/codegangsta/martini-contrib/render"
"github.com/go-martini/martini"
)
func Example(router martini.Router) {
router.Get("", func(r render.Render) {
// respond to query
r.JSON(200, "")
})
}
在每个扩展go文件中使用init
方法注册扩展
在plugin1.go
中,你要写
func init() {
App.Router.Group("/example", extensions.Example)
}
你需要让app
公开
可以在主代码中使用注册函数。
我在rclone中使用了这种技术:下面是注册函数,下面是调用它的示例。每个模块通过将它们包含在主包