这是Go应用程序项目的基础布局。这不是Go核心开发团队定义的官方标准;无论是在经典项目还是在新兴的项目中,这都是Go生态系统中一组常见的项目布局模式。这其中有一些模式比另外的一些更受欢迎。它通过几个支撑目录为任何足够大规模的实际应用程序提供一些增强功能。

main.gointernalvendor
GoModulesGoModules$GOPATHgo.modModuleModule

本项目布局有意设计的更通用一些,而不会尝试去引入一些特定的Go包结构。

这是社区共同的努力。如果发现了一种新的模式或者项目中已经存在的某些模式需要更新是,请新建一个issue。

如果需要一些关于命名、格式化或者样式方面的帮助,请先运行和。另外,请务必阅读以下Go代码样式指南和建议:

  • Style guideline for Go packages (rakyll/JBD)

更多背景信息请查看。

有关命名和项目包组织样式以及其他代码结构的更多推荐文章:

Go目录

/cmd

项目主要的应用程序。

/cmd/myapp
/pkg/internal
mainmain/internal/pkg

更多详情,请看目录中的例子。

/internal
internal
/internal/appinternal/app/myapp/internal/pkginternal/pkg/myprivlib
/pkg
/pkg/mypubliclibinternal/pkgpkginernal

当您的根目录包含大量非Go组件和目录时,这也是一种将Go代码分组到一个位置的方法,从而使运行各种Go工具更加容易(在如下的文章中都有提到:2018年GopherCon Best Practices for Industrial Programming,Kat Zien - How Do You Structure Your Go Apps ,Golab 2018 Massimiliano Pippi - Project layout patterns in Go)。

/pkg

如果项目确实很小并且嵌套的层次并不会带来多少价值(除非你就是想用它),那么就不要使用它。请仔细思考这种情况,当项目变得很大,并且根目录中包含的内容相当繁杂(尤其是有很多非Go的组件)。

/vendor
go mod vendor/vendorgo build-mod=vendor

构建库文件时,不要提交应用程序依赖项。

https://proxy.golang.orgGoModulevendor

服务端应用程序的目录

/api

OpenAPI/Swagger规范,JSON模式文件,协议定义文件。

更多样例查看目录。

Web应用程序的目录

/web

Web应用程序特定的组件:静态Web资源,服务器端模板和单页应用(Single-Page App,SPA)。

通用应用程序的目录

/configs

配置文件模板或默认配置。

confdconsul-template
/init

系统初始化(systemd、upstart、sysv)和进程管理(runit、supervisord)配置。

/scripts

用于执行各种构建,安装,分析等操作的脚本。

这些脚本使根级别的Makefile变得更小更简单(例如 https://github.com/hashicorp/terraform/blob/master/Makefile )。

更多样例查看。

/build

打包和持续集成。

/build/package
build/ci/build/ci
/deployments
/deploy
/test
/test/test/data/test/testdata._

更多样例查看。

其他

/docs

设计和用户文档(除了godoc生成的文档)。

更多样例查看。

/tools
/pkg/internal

更多样例查看。

/examples

应用程序或公共库的示例。

更多样例查看。

/third_party

外部辅助工具,fork的代码和其他第三方工具(例如Swagger UI)。

/githooks

Git的钩子。

/assets

项目中使用的其他资源(图像,Logo等)。

/website

如果不使用Github pages,则在这里放置项目的网站数据。

更多样例查看。

不应该出现的目录

/src
src
/src/src$GOPATH$HOME/go/pkg/bin/src/src/src/some/path/to/workspace/src/your_project/src/your_code.go

徽章

gofmtvetgocyclogolintineffassignlicensemispellgithub.com/golang-standards/project-layout

注意

sample/reusable