外部应用程序可以使用的库代码(例如 `/pkg/mypubliclib`)。其他项目会导入这些库,希望它们能正常工作,所以在这里放东西之前要三思:-)注意,`internal` 目录是确保私有包不可导入的更好方法,因为它是由 Go 强制执行的。`/pkg`目录仍然是一种很好的方式,可以显式地表示该目录中的代码对于其他人来说是安全使用的好方法。由Travis Jeffery 撰写的 [`I'll take pkg over internal`](https://travisjeffery.com/b/2019/11/i-ll-take-pkg-over-internal/) 博客文章提供了 `pkg` 和 `internal` 目录的一个很好的概述,以及什么时候使用它们是有意义的。
当根目录包含大量非 Go 组件和目录时,这也是一种将 Go 代码分组到一个位置的方法,这使得运行各种 Go 工具变得更加容易(正如在这些演讲中提到的那样: 来自 GopherCon EU 2018 的 [`Best Practices for Industrial Programming`](https://www.youtube.com/watch?v=PTE4VJIdHPg) , [GopherCon 2018: Kat Zien - How Do You Structure Your Go Apps](https://www.youtube.com/watch?v=oL6JBUk6tj0) 和 [GoLab 2018 - Massimiliano Pippi - Project layout patterns in Go](https://www.youtube.com/watch?v=3gQa1LWwuzk) )。
如果你想查看哪个流行的 Go 存储库使用此项目布局模式,请查看 [`/pkg`](pkg/README.md) 目录。这是一种常见的布局模式,但并不是所有人都接受它,一些 Go 社区的人也不推荐它。
如果你的应用程序项目真的很小,并且额外的嵌套并不能增加多少价值(除非你真的想要:-),那就不要使用它。当它变得足够大时,你的根目录会变得非常繁琐时(尤其是当你有很多非 Go 应用组件时),请考虑一下。
### `/vendor`
应用程序依赖项(手动管理或使用你喜欢的依赖项管理工具,如新的内置 [`Go Modules`](https://github.com/golang/go/wiki/Modules) 功能)。`go mod vendor` 命令将为你创建 `/vendor` 目录。请注意,如果未使用默认情况下处于启用状态的 Go 1.14,则可能需要在 `go build` 命令中添加 `-mod=vendor` 标志。
有些 Go 项目确实有一个 `src` 文件夹,但这通常发生在开发人员有 Java 背景,在那里它是一种常见的模式。如果可以的话,尽量不要采用这种 Java 模式。你真的不希望你的 Go 代码或 Go 项目看起来像 Java:-)
不要将项目级别 `src` 目录与 Go 用于其工作空间的 `src` 目录(如 [`How to Write Go Code`](https://golang.org/doc/code.html) 中所述)混淆。`$GOPATH` 环境变量指向你的(当前)工作空间(默认情况下,它指向非 windows 系统上的 `$HOME/go`)。这个工作空间包括顶层 `/pkg`,`/bin` 和 `/src` 目录。你的实际项目最终是 `/src` 下的一个子目录,因此,如果你的项目中有 `/src` 目录,那么项目路径将是这样的: `/some/path/to/workspace/src/your_project/src/your_code.go`。注意,在 Go 1.11 中,可以将项目放在 `GOPATH` 之外,但这并不意味着使用这种布局模式是一个好主意。
## Badges
* [Go Report Card](https://goreportcard.com/) - It will scan your code with `gofmt`, `go vet`, `gocyclo`, `golint`, `ineffassign`, `license` and `misspell`. Replace `github.com/golang-standards/project-layout` with your project reference.
* [GoDoc](http://godoc.org) - It will provide online version of your GoDoc generated documentation. Change the link to point to your project.
* Release - It will show the latest release number for your project. Change the github link to point to your project.