styleguide/go/index.md

192 lines
8.4 KiB
Markdown
Raw Normal View History

# Go Style
https://google.github.io/styleguide/go
[Overview](index) | [Guide](guide) | [Decisions](decisions) |
[Best practices](best-practices)
<!--
-->
{% raw %}
<a id="about"></a>
## About
The Go Style Guide and accompanying documents codify the current best approaches
for writing readable and idiomatic Go. Adherence to the Style Guide is not
intended to be absolute, and these documents will never be exhaustive. Our
intention is to minimize the guesswork of writing readable Go so that newcomers
to the language can avoid common mistakes. The Style Guide also serves to unify
the style guidance given by anyone reviewing Go code at Google.
Document | Link | Primary Audience | [Normative] | [Canonical]
------------------- | ----------------------------------------------------- | ------------------- | ----------- | -----------
**Style Guide** | https://google.github.io/styleguide/go/guide | Everyone | Yes | Yes
**Style Decisions** | https://google.github.io/styleguide/go/decisions | Readability Mentors | Yes | No
**Best Practices** | https://google.github.io/styleguide/go/best-practices | Anyone interested | No | No
[Normative]: #normative
[Canonical]: #canonical
<a id="docs"></a>
### Documents
1. The **[Style Guide](https://google.github.io/styleguide/go/guide)** outlines
the foundation of Go style at Google. This document is definitive and is
used as the basis for the recommendations in Style Decisions and Best
Practices.
1. **[Style Decisions](https://google.github.io/styleguide/go/decisions)** is a
more verbose document that summarizes decisions on specific style points and
discusses the reasoning behind the decisions where appropriate.
These decisions may occasionally change based on new data, new language
features, new libraries, or emerging patterns, but it is not expected that
individual Go programmers at Google should keep up-to-date with this
document.
1. **[Best Practices](https://google.github.io/styleguide/go/best-practices)**
documents some of the patterns that have evolved over time that solve common
problems, read well, and are robust to code maintenance needs.
These best practices are not canonical, but Go programmers at Google are
encouraged to use them where possible to keep the codebase uniform and
consistent.
These documents intend to:
* Agree on a set of principles for weighing alternate styles
* Codify settled matters of Go style
* Document and provide canonical examples for Go idioms
* Document the pros and cons of various style decisions
* Help minimize surprises in Go readability reviews
* Help readability mentors use consistent terminology and guidance
These documents do **not** intend to:
* Be an exhaustive list of comments that can be given in a readability review
* List all of the rules everyone is expected to remember and follow at all
times
* Replace good judgment in the use of language features and style
* Justify large-scale changes to get rid of style differences
There will always be differences from one Go programmer to another and from one
team's codebase to another. However, it is in the best interest of Google and
Alphabet that our codebase be as consistent as possible. (See
[guide](guide#consistency) for more on consistency.) To that end, feel free to
make style improvements as you see fit, but you do not need to nit-pick every
violation of the Style Guide that you find. In particular, these documents may
change over time, and that is no reason to cause extra churn in existing
codebases; it suffices to write new code using the latest best practices and
address nearby issues over time.
It is important to recognize that issues of style are inherently personal and
that there are always inherent trade-offs. Much of the guidance in these
documents is subjective, but just like with `gofmt`, there is significant value
in the uniformity they provide. As such, style recommendations will not be
changed without due discourse, Go programmers at Google are encouraged to follow
the style guide even where they might disagree.
<a id="definitions"></a>
## Definitions
The following words, which are used throughout the style documents, are defined
below:
* **Canonical**: Establishes prescriptive and enduring rules
<a id="canonical"></a>
Within these documents, "canonical" is used to describe something that is
considered a standard that all code (old and new) should follow and that is
not expected to change substantially over time. Principles in the canonical
documents should be understood by authors and reviewers alike, so everything
included within a canonical document must meet a high bar. As such,
canonical documents are generally shorter and prescribe fewer elements of
style than non-canonical documents.
https://google.github.io/styleguide/go#canonical
* **Normative**: Intended to establish consistency <a id="normative"></a>
Within these documents, "normative" is used to describe something that is an
agreed-upon element of style for use by Go code reviewers, in order that the
suggestions, terminology, and justifications are consistent. These elements
may change over time, and these documents will reflect such changes so that
reviewers can remain consistent and up-to-date. Authors of Go code are not
expected to be familiar with the normative documents, but the documents will
frequently be used as a reference by reviewers in readability reviews.
https://google.github.io/styleguide/go#normative
* **Idiomatic**: Common and familiar <a id="idiomatic"></a>
Within these documents, "idiomatic" is used to refer to something that is
prevalent in Go code and has become a familiar pattern that is easy to
recognize. In general, an idiomatic pattern should be preferred to something
unidiomatic if both serve the same purpose in context, as this is what will
be the most familiar to readers.
https://google.github.io/styleguide/go#idiomatic
<a id="references"></a>
## Additional references
This guide assumes the reader is familiar with [Effective Go], as it provides a
common baseline for Go code across the entire Go community.
Below are some additional resources for those looking to self-educate about Go
style and for reviewers looking to provide further linkable context in their
reviews. Participants in the Go readability process are not expected to be
familiar with these resources, but they may arise as context in readability
reviews.
[Effective Go]: https://go.dev/doc/effective_go
**External References**
* [Go Language Specification](https://go.dev/ref/spec)
* [Go FAQ](https://go.dev/doc/faq)
* [Go Memory Model](https://go.dev/ref/mem)
* [Go Data Structures](https://research.swtch.com/godata)
* [Go Interfaces](https://research.swtch.com/interfaces)
* [Go Proverbs](https://go-proverbs.github.io/)
* <a id="gotip"></a> Go Tip Episodes - stay tuned.
* <a id="unit-testing-practices"></a> Unit Testing Practices - stay tuned.
**Relevant Testing-on-the-Toilet articles**
* [TotT: Identifier Naming][tott-431]
* [TotT: Testing State vs. Testing Interactions][tott-281]
* [TotT: Effective Testing][tott-324]
* [TotT: Risk-driven Testing][tott-329]
* [TotT: Change-detector Tests Considered Harmful][tott-350]
[tott-431]: https://testing.googleblog.com/2017/10/code-health-identifiernamingpostforworl.html
[tott-281]: https://testing.googleblog.com/2013/03/testing-on-toilet-testing-state-vs.html
[tott-324]: https://testing.googleblog.com/2014/05/testing-on-toilet-effective-testing.html
[tott-329]: https://testing.googleblog.com/2014/05/testing-on-toilet-risk-driven-testing.html
[tott-350]: https://testing.googleblog.com/2015/01/testing-on-toilet-change-detector-tests.html
**Additional External Writings**
* [Go and Dogma](https://research.swtch.com/dogma)
* [Less is exponentially more](https://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html)
* [Esmerelda's Imagination](https://commandcenter.blogspot.com/2011/12/esmereldas-imagination.html)
* [Regular expressions for parsing](https://commandcenter.blogspot.com/2011/08/regular-expressions-in-lexing-and.html)
* [Gofmt's style is no one's favorite, yet Gofmt is everyone's favorite](https://www.youtube.com/watch?v=PAAkCSZUG1c&t=8m43s)
(YouTube)
<!--
-->
{% endraw %}