首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go -如何组织动态包的代码

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

Stack Overflow用户
提问于 2013-08-10 03:11:12
回答 1查看 156关注 0票数 1

我有一个用Go编写的小型web应用程序。它是为更大的系统创建的基础,我希望它是可扩展的,可以在不需要以任何方式修改这个基础的情况下添加/删除组件。

该结构当前为:

代码语言:javascript
复制
       App
         Modules
             Core
                 ... Core Files Here ...
       app.go
   main.go

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

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

例如,我可能会添加一个名为“博客”的新模块/组件,例如:

代码语言:javascript
复制
       App
         Modules
             Core
                 ... Core Files Here ...
                 controller.go
             Blog
                 ... Blog Files Here ...
                 controller.go
       app.go
   main.go
EN

回答 1

Stack Overflow用户

发布于 2013-08-10 03:37:08

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

  • 带有ServeHTTP方法的Application类型,它充当您的主应用程序
  • 所有组件都必须实现的Component接口。您可能希望在其中包含BaseUrl() stringServeHTTP方法。
  • Register方法添加到Application类型,该方法可用于向应用程序添加新组件。

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

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

代码语言:javascript
复制
func main() {
    app := core.NewApplication()
    app.Register(blog.Blog{
        Title: "My Personal Blog",
    })
    app.Register(...)
    app.Run()
}

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18153971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档