参考:https://github.com/golang-standards/project-layout

/cmd

本项目的主干。
每个应用程序的目录名应该与你想要的可执行文件的名称相匹配,例如:

  • cmd/
    • app1/
      • main.go
    • app2/
      • main.go

/internal

这个包存放本项目的包,注意放在这里的包不能被其他项目import,在build其中,go的编译器会做强制校验(1.4加入的特性),例如:

  • internal/
    • app1/
      • routes/
      • controllers/
      • services/
      • models/
      • dtos/
    • app2/
    • pkg/ 这里存放app1与app2公用的包,例如response结构体,自定义的error,中间键等

/pkg

如果你把代码包放在根目录的pkg下,其他项目是可以直接导入pkg下的代码包的,即这里的代码包是开放的。一般项目不会使用到,但考虑到项目不确定性,项目初始化时,最好带上这个目录

/vendor

应用程序依赖项,执行go mod vendor 会自动生成该目录,并导入项目依赖
注意在go mod模式下,不会引入vendor下的包(导包爆红,使用 go mod tidy)
image.png

/web

前后端没分离的项目才会使用,存放前端资源

/configs

项目配置文件,例如:

  • configs/
    • app1/
      • app1.toml
    • app2/
      • app2.yaml

/docs

设计文档,使用文档等

  • docs/
    • app1/
    • app2

/logs

日志目录,一般情况下,该目录下的所有内容会设置为ignore,不提交到代码仓库。开发人员做测试才会使用

/test

额外的外部测试应用程序和测试数据。你可以随时根据需求构造 /test 目录。通常可以用来做demo测试,除非与项目本身完整性有直接关系,该目录下所有内容可以设置为ignore,不提交到代码仓库。

go.mod

使用go moudle做管理,执行go mod init时,自动生成

go.sum

使用go moudle做管理,执行go mod vendor或其他有pull性质命令时会自动生成

面向包的设计

  • 细化包目录
  • import包的最后一层,要非常明确包的主要功能

例如:

  • internal/
    • app1/
      • controllers/
        • UserController.go
        • AdminController.go

应改为:

  • internal/
    • app1/
      • controllers/
        • usercontroller/
          • user.go
        • admincontroller/
          • admin.go