Go:每个项目有多少个包

时间:2014-12-07 15:43:17

标签: go project-management packages directory-structure

今天在我的Go项目上工作时,我意识到我遇到了一个小问题。我有一个package,其struct指向另一个package的结构。但是,package也使用了另一个包中的结构。在C和C ++中,这不会造成问题,因为我使用了头部保护。但是,在Go中,由于无限import递归,这样的程序将无法编译。

这让我很奇怪,我的项目中有太多包吗?我应该支持更大的包裹吗?我总是被告知,每个包都应该专注于一件事。

现在,我的结构是这样的。

game/                  <-- imports engine, needs to access the resource manager a lot
    video/             <-- rendering goes here
        renderer.go
        shader.go
        scene.go
        ...
    engine/            <-- imports video, file, etc
        root.go        <-- contains a Root struct, handles initialisation etc
        resource.go
        ...
    file/
        dds.go
        config.go
        resource_list.go
        script.go
        ...
    main.go
    ...

那就是说,这是我的问题:

  • 您如何解决这个问题?您是否会合并videoengine个套餐?重新设计您的计划,以便video不再依赖engine
  • 您如何确定何时制作新包装?您是基于功能吗?你按类别分组吗?
  • 您对main软件包有多大用处?我个人倾向于尽快摆脱它,可能是因为我已经习惯了OOP。

1 个答案:

答案 0 :(得分:1)

由于这些问题相当广泛且项目特定,我只能希望这有任何帮助:

  • 就个人而言,我会尝试创建第三个包,videoengine都可以依赖。但是,根据项目的不同,这可能很难做到,而且可能需要合并。
  • 新包通常是一个特定的任务。根据项目的不同,这可能是数据库I / O,包括所有模型 - 但它也可能是一个仅从磁盘读取配置文件的软件包。
  • 由于我主要构建了web-apps,我使用main包来启动:收听端口,调用其他函数,确保数据库连接正确关闭等。

示例(不确定是否有用?):

我曾经有一个只是配置(config)的包,它引用了其余的包(出于某种原因)。但是,其他包取决于config内的配置。这是main包可以派上用场的地方:通过参数将config包与其他包链接起来。


VonC的评论也非常有用和精细。它可能会帮助你更多。