integration with the name of that feature. Start the names of its
files with the same name. Keep a name generic only when more than one
feature uses it.
-- Use unexported names. In the `main` package, an exported name has no
- effect.
-- Write all the letters of an initialism in one case.
+- Write type names with a capital letter, so that a variable can have
+ the name of its type. Write all other package-level names in lower
+ case.
+- Write all the letters of an initialism in one case. `revive` checks
+ common initialisms.
- Put entry points first, then each struct's methods as a group, then
standalone utility functions. Do not put a utility function between
the methods of one type.
different variable only to keep or join errors.
- Use `errors.Is` and `errors.As` to examine errors. Do not compare an
error directly with a sentinel, because errors can be wrapped.
+ `errorlint` checks comparisons and type assertions on errors.
- When a function has more than one error path, wrap each returned error
with the context of its operation. A function with one error path can
- return the error directly.
+ return the error directly. `wrapcheck` checks package and interface
+ calls, with the exceptions in `.golangci.yml`. Review local calls and
+ the number of error paths by hand.
- When deferred cleanup can fail, use a named `err` result and join the
cleanup error with `errors.Join`.
- Put an empty line between logical blocks, also after multiline
declarations, assignments, literals, and calls. Keep an operation with
its immediate error or result check. Keep a short declaration with its
- immediate use.
+ immediate use. `wsl_v5` and `nlreturn` check part of this rule. Review
+ the remaining logical blocks and immediate-use groups by hand.
- Use GNU-style command flags: two dashes for long flags, such as
`--cwd`, and one dash only for one-letter flags, such as `-h`.
- Prefer the Go standard library. Prefer Go over cgo.
- Add tests for meaningful behavior. Do not add tests that only repeat
implementation details.
-- Use `testify/require` for assertions.
+- Use `testify/require` for assertions. `testifylint` checks the
+ assertion forms.
- Name a table-driven case slice `testCases` and its range variable
`tc`. A subtest name describes the behavior, not a generic outcome or
input.
- In a test file, put constants immediately after the imports, then the
tests, then supporting types, methods, and helpers.
+- Keep a helper that only one test file uses in that file. Put a helper
+ that more than one test file uses in a file without tests. Name that
+ file for what it holds, and end the name with `_helper_test.go`.
- Supply valid required dependencies in tests. Do not make a dependency
optional only to make a test simpler.