2014-06-09 43 views
8

我對Go很新,很好奇,如果有可擴展應用程序的既定設計模式。Golang自動 - 包括可擴展應用程序

例如,在我的源文件中,我有一個擴展目錄,我在其中爲我的程序放置了不同的應用程序特定擴展。我目前通過名稱逐個加載我的主函數。我希望程序在編譯時自動包含我的擴展。

只是要清楚,我不是試圖在運行時動態加載擴展。我只想讓添加的擴展程序一樣簡單:

  1. 刪除文件擴展文件夾
  2. 重新編譯

如果這僅僅是不可能去那麼我會讓因爲,但我只是想,必須有更好的方式來做到這一點。

爲了更清楚我想要什麼簡單顯示,這裏是我現在做的一個例子:

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

將軟件包置於模塊路徑的子目錄下,並將子模塊導入到main。但是你需要爲所有'擴展名'添加一個標準包名稱並處理名稱衝突等等......一個噩夢:D – fabrizioM

+0

另一種方法是使用像Packer一樣的RPC:http://www.packer.io/docs /extend/developing-plugins.html – elithrar

回答

4

在每個擴展名go文件中使用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

+1

謝謝!我完全忘了init包()存在於Go包中。 – KayoticSully