我是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, "")
})
}
答案 0 :(得分:4)
在每个扩展程序转到文件中使用init
方法注册扩展程序。
所以在plugin1.go
你要写
func init() {
App.Router.Group("/example", extensions.Example)
}
您需要公开app
。
您可以在主代码中使用注册功能。
我在rclone中使用此技术:Here is the registration function和here is an example of it being called。每个模块都在by including them in the main pacakge
中编译