Go - 如何组织动态包的代码

时间:2013-08-09 19:11:12

标签: go

我有一个用Go编写的小型Web应用程序。它是为更大的系统创建的基础,我希望它可以扩展,可以添加/删除组件,而无需以任何方式修改此基础。

目前的结构是:

       App
         Modules
             Core
                 ... Core Files Here ...
       app.go
   main.go

app.go将包含一个路由方法,该方法应该接受Web请求,并根据请求路径知道哪个模块负责处理请求。每个模块/组件都有其控制器。

每个组件都有自己的包名,所以我认为这是不可能的,因为强制显式导入。

例如,我可以添加一个名为say blog的新模块/组件,例如:

       App
         Modules
             Core
                 ... Core Files Here ...
                 controller.go
             Blog
                 ... Blog Files Here ...
                 controller.go
       app.go
   main.go

1 个答案:

答案 0 :(得分:3)

有几种方法可以实现您的目标。由于Go目前不支持动态加载的库,因此您需要在添加/删除任何组件时重新编译应用程序。因此,最简单的方法是yourapp/core包,其中包含以下内容:

  • Application类型,其中ServeHTTP方法充当您的主要应用
  • 所有组件必须实现的Component接口。您可能希望在那里添加BaseUrl() stringServeHTTP方法。
  • Register类型的Application方法,可用于向您的应用添加新组件。

然后,您的组件可以在单独的包中实现(例如yourapp/blog),它们可能取决于您的yourapp/core包。

唯一需要“用户可编辑”的是main.go文件,它可能如下所示:

func main() {
    app := core.NewApplication()
    app.Register(blog.Blog{
        Title: "My Personal Blog",
    })
    app.Register(...)
    app.Run()
}

另一种方法可能是为组件定义RPC接口(可能包括RegisterComponentUnregisterComponentGetGlobalConfig等函数。

然后,您可以在单独的进程中运行这些组件,这些进程的优点是您可以动态地启动/停止/重新加载这些组件,并且它们不会破坏您的主应用程序。如果您想使用此方法,请查看net/rpc包,甚至httputil.NewSingleHostReverseProxy