Golang自动 - 包括可扩展的应用程序

时间:2014-06-09 17:35:11

标签: design-patterns go

我是Go的新手,如果有可扩展应用程序的既定设计模式,我很好奇。

例如,在我的源代码中,我有一个扩展目录,我为我的程序放置了不同的特定于应用程序的扩展。我目前按名称单独加载每个主要功能。我希望程序在编译时自动包含我的扩展名。

为了清楚起见,我不是试图在运行时动态加载扩展。我只想在程序中添加一个简单的扩展名:

  1. 将文件拖放到扩展文件夹
  2. 重新编译
  3. 如果这对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, "")
        })
    }
    

1 个答案:

答案 0 :(得分:4)

在每个扩展程序转到文件中使用init方法注册扩展程序。

所以在plugin1.go你要写

func init() {
    App.Router.Group("/example", extensions.Example)
}

您需要公开app

您可以在主代码中使用注册功能。

我在rclone中使用此技术:Here is the registration functionhere is an example of it being called。每个模块都在by including them in the main pacakge

中编译