【问题标题】:Go: how many packages per project [closed]Go:每个项目有多少个包[关闭]
【发布时间】:2014-12-08 00:13:21
【问题描述】:

今天在处理我的 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。

【问题讨论】:

标签: go project-management packages directory-structure


【解决方案1】:

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

  • 就个人而言,我会尝试创建第三个包,videoengine 都可以依赖它。不过,根据项目的不同,这可能是一件困难的事情,并且可能需要合并它们。
  • 一个新的包通常是关于一个特定的任务。根据项目的不同,这可能是数据库 I/O,也包括所有模型 - 但它也可能是一个仅用于从磁盘读取配置文件的包。
  • 由于我主要构建 Web 应用程序,因此我使用 main 包开始:监听端口、调用其他函数、确保正确关闭数据库连接等。

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

我曾经有一个只是关于配置的包 (config),它引用了其余的包(出于某种原因)。然而,其他包依赖于config 中的那些配置。这就是main 包可以派上用场的地方:通过参数将config 包与其他包链接。


VonC 的评论也非常有用和详尽。它可能对您的帮助远不止这些。

【讨论】:

  • 作为一般原则,如果两个包相互依赖,通常可以通过添加第三个附属包来打破依赖循环。同样的原则也适用于可能会死锁的相互依赖的 goroutine。添加第三个“服务”goroutine 是解决相互依赖的 goroutine 导致的死锁的方法之一。这里有一个共同的模式。
猜你喜欢
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
相关资源
最近更新 更多