Creating the Directory Structure
In this lesson, you will learn about some best practices that emerged in the Go community when building large-scale programs. Then, you'll select a directory structure for multi-git.
Common directory structures for Go programs
We identified common elements of a Go program, but, how do we go about organizing them in a directory structure? We will discuss several common approaches.
Flat single directory
The flat single directory approach has no internal structure. All the files live in the project’s root directory. This is the approach used by multi-git 0.1, and it is appropriate for very small programs.
The minimal approach
The minimal approach advocates just two top-level directories: cmd
for executables and pkg
for libraries. For each command and package, there will be a sub-directory under the respective cmd
and pkg
directories. Every other file that belongs to a specific command or package will live in their sub-directory. Project-level files live in the project’s root directory.
The main benefit of this approach is its simplicity. The top-level structure of the project is very clear. The downside of this approach is that it doesn’t help organize the code inside commands and packages. Large programs have many concerns and files beyond just Go files.
The comprehensive approach
The comprehensive approach advocates a separate top-level directory for every major aspect of the program. What are those aspects can differ from project to project. Check out https://github.com/golang-standards/project-layout for an extreme variant with 19 top-level directories. Of course you don’t have to use ALL those directories.
The multi-git directory structure
For multi-git, we chose a pretty minimal directory structure with just three top-level directories: cmd
, pkg
, and e2e
. We know all about cmd
and pkg
, but what is e2e
? It’s a directory that contains end-to-end tests. Those tests don’t belong in a package and I don’t want to add them to the cmd
directory where they will be mixed with other executables. Without further ado, here is the new multi-git top-level directory structure:
$ tree -L 1
.
├── LICENSE
├── README.md
├── main.go
├── cmd
├── pkg
├── e2e
Conclusion
A consistent and well-organized directory structure is essential for large programs developed by multiple developers. Go has several distinct elements such as packages and commands that it makes sense to organize in separate directory hierarchies. There are several popular directory organization schemes in the Go community, but no formal standard. For multi-git, we will use a simple directory structure with top-level directories for commands, packages, and end-to-end tests.
Quiz
Get hands-on with 1400+ tech skills courses.