GitHub - wangyoucao577/go-project-layout: My understanding of how to structure a golang project. (original) (raw)

Go Project Layout

This is my understanding of how to structure Go project layout. The most important part is how to organize your Go code into packages.

Motivation

A good project layout will make your source code easy to understand, easy to test, and easy to maintain.
Kat Zien has a very good summary(Slides) for this, so I'd like to refer it directly as below:

Questions, decisions

Why should we care?

Because if Go is going to be a language that companies invest in for the long term, the maintenance of Go programs, the ease of which they can change, will be a key factor in their decision. - Dave Cheney, Golang UK 2016 keynote

Good structure goals

Demo

shell 1

$ go version go version go1.13.1 linux/amd64 $ $ cd $GOPATH $ $ # app 1: reverse echo $ go get -u github.com/wangyoucao577/go-project-layout/cmd/echor $ ./bin/echor "hello world" dlrow olleh $ $ # app 2: a simple diagnosis service for server diagnosis. $ # return Hostname/IP/CPUs/RemoteAddr... by HTTP. $ # sample request: http://localhost:8000/diagnosis?diagnosis=ping $ go get -u github.com/wangyoucao577/go-project-layout/cmd/diagnosis $ ./bin/diagnosis -alsologtostderr I1007 18:50:05.550952 3769 main.go:33] Listen on :8000

shell 2

$ curl "http://localhost:8000/diagnosis?diagnosis=ping" { "Hostname":"server", "IP Addresses":[ "192.168.29.201/24", "fe80::1c20:479:9094:4327/64", "192.168.141.1/24", "fe80::8002:2d87:c4f3:4aab/64", "192.168.128.1/24", "fe80::eca9:cfa0:9443:b8ff/64", "192.168.44.209/28", "fe80::8551:306e:7e7:6faf/64" ], "CPUs":8, "Remote Endpoint":"127.0.0.1:64717" }

Note

This topic is kind of best practices. I'd like to discuss some of them and my opinion, then maybe deep into more best practices in the future.

Top dir /cmd

[My opinion: Strongly recommended]
The cmd layout pattern is very useful when you need to have more than one application binary.

Top dir /pkg

[My opinion: NOT good enough, use it if good for you]

Group packages by dependency

[My opinion: Strongly recommended]

More best practices

References