go-resources/project_structure.md

39 lines
2.3 KiB
Markdown
Raw Normal View History

2021-05-01 05:05:22 +00:00
# Project Structure
2021-05-11 14:27:10 +00:00
One of Go's strength's is its simplicity. Project structure should be kept simple as well.
### A Common Misconception
Although the [golang-standards/project-layout](https://github.com/golang-standards/project-layout) repo looks official (23k+ stars, "golang" in the name, etc), it is not. [Russ Cox](https://swtch.com/~rsc/), a principal engineer at Google and the [most active contributor](https://github.com/golang/go/graphs/contributors) to Go has opened an [issue](https://github.com/golang-standards/project-layout/issues/117) to address this.
### How Complex is Your Project?
On the complex end of the spectrum, projects like [CockroachDB](https://github.com/cockroachdb/cockroach) and [Kubernetes](https://github.com/kubernetes/kubernetes) use a complex project structure. [gorilla/mux](https://github.com/gorilla/mux) is comparatively simple. It has no dependencies and has no directory structure. Here are complexity scores for these 3 projects, and a few others, using [scc](https://github.com/boyter/scc):
| Project | Lines in .go Files | Complexity score |
| :--- | ---: | ---: |
| [Kubernetes](https://github.com/kubernetes/kubernetes) | 4,913,049 | 524,227 |
| [CockroachDB](https://github.com/cockroachdb/cockroach) | 4,064,838 | 725,465 |
| [gitea](https://github.com/go-gitea/gitea) | 223,761 | 39,001 |
| [hugo](https://github.com/gohugoio/hugo) | 148,613 | 16,642 |
| [go-github](https://github.com/google/go-github) | 117,131 | 15,637 |
|[traefik](https://github.com/traefik/traefik) | 107,542 | 9,154 |
| [gio](https://gioui.org/) | 47,283 | 5,122 |
| [gorilla/mux](https://github.com/gorilla/mux) | 6,661 | 763 |
The complexity scores are rough estimates, but are useful in realizing how complex your code is. Creating project structure is not a pure science. There is an art to knowing how to lay out a project based on its current state, and its trajectory.
If your project is simple, do not add unnecessary structure. This increases the cognitive load of anyone trying to use the project.
### Package `internal`
### Package `pkg`
### Use Encapsulation Tools to Create Project Structure
Just as structs, funcs, files, packages, and modules are
### Adding Complexity Should be Justified
### Use Other Methods of Abstraction
### Other Resources