Don't communicate by sharing memory; share memory by communicating.
Prefer a channel handoff over a mutex-guarded shared variable when the
design allows it — it makes ownership explicit instead of implicit.
The bigger the interface, the weaker the abstraction. (Ch. 54.2)
Accept interfaces, return structs. (Ch. 54.1)
A little copying is better than a little dependency. Duplicating a
small helper function across two packages beats importing a whole
library for it.
Clear is better than clever. Optimize for the next reader, not for
showing off language features.
Errors are values. Handle them like any other value — wrap, inspect,
compare — not like a control-flow escape hatch.
Don't just check errors, handle them gracefully. (Ch. 54.3)
gofmt's style is no one's favorite, yet gofmt is everyone's
favorite. Never bikeshed formatting; run gofmt/goimports and move
on.