go - 单个 go 项目使用的 go 包的正确文件夹结构

标签 go structure organization

我目前正在开始使用 Go,并且已经深入研究了有关包命名和工作区文件夹结构的注意事项。

不过,我不太确定如何根据 Go 范式正确组织我的代码。

这是我当前的结构示例,它位于 $GOPATH/src 中:

github.com/myusername/project
|-- main.go
+-- internal
+---- config
|------ config.go

所以我有一个名为 project 的项目,它使用 config 包,而该包又以一种只应由 project 使用的方式专门化。因此,我不希望它位于 github.com/myusername/config 下,对吗?

现在的问题是,使用内部包结构是否“好”,或者我应该将我的项目特定包放在 github.com/myusername/$pkgname 下并以某种方式表明它属于到 project(例如,将其命名为 projectconfig)?

最佳答案

如果您的项目只生成一个程序,那么最常见的结构就是您提到的结构。

如果您的项目产生多个程序,通常的做法是使用如下结构:

<project>/
  cmd/
    prog1/
      main.go
    prog2/
      main.go

如果您的项目将 Go 代码公开为库供第三方使用,最常见的结构是使用项目的根目录公开域模型和 API。

<project>/
  model.go
  api.go

这适用于第三方代码,只需导入“github.com/user/project”并提供可用的模型和 api。

常见的是第二个和第三个选项的组合。

拥有用于封装依赖项使用的包也被认为是一种很好的做法。例如。假设你的项目使用 Elasticsearch 客户端

<project>/
  cmd/
    prog1/
      main.go
  elastic/
    impl.go
  dao.go
  model.go

所以在 dao.go 中你定义了 dao 的 API,然后在 elastic/impl.go 中你(导入弹性库、域模式和)根据弹性定义 DAO 的实现。最后,您从生成实际程序的 main.go 导入所有内容。

参见 this关于这个问题的精彩而简短的介绍。

关于go - 单个 go 项目使用的 go 包的正确文件夹结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41533693/

相关文章:

go - 通过 Golang API 上传大文件到 Google Drive

go - 无论平台如何,如何在所有代码上运行go vet

c++ - 如何使用 CTypedPtrArray

javascript - 按名称对对象中的函数/变量进行排序

go - 如何使用多个 negroni.Wrap()

csv - 如何读取 csv 文件并将其内容指向变量?

容量超过 Int.MaxValue 的 C# 数组

c - 如何在模块化编程中使用结构?

Java 代码组织 : Where to keep instance of static class

python - Python 应用程序的最佳项目结构是什么?