Skip to content

Enable linters and formatters #43

@alexgarzao

Description

@alexgarzao

Configure and run golangci-lint in Makefile and CI.

Formatters to be enabled:

  • goimports # checks if the code and import statements are formatted according to the 'goimports' command
  • golines # checks if code is formatted, and fixes long lines
  • gci # checks if code and import statements are formatted, with additional rules
  • gofmt # checks if the code is formatted according to 'gofmt' command
  • gofumpt # enforces a stricter format than 'gofmt', while being backwards compatible

Linters to be enabled:

  • asasalint # checks for pass []any as any in variadic func(...any)
  • asciicheck # checks that your code does not contain non-ASCII identifiers
  • bidichk # checks for dangerous unicode character sequences
  • bodyclose # checks whether HTTP response body is closed successfully
  • canonicalheader # checks whether net/http.Header uses canonical header
  • copyloopvar # detects places where loop variables are copied (Go 1.22+)
  • cyclop # checks function and package cyclomatic complexity
  • depguard # checks if package imports are in a list of acceptable packages
  • dupl # tool for code clone detection
  • durationcheck # checks for two durations multiplied together
  • embeddedstructfieldcheck # checks embedded types in structs
  • errcheck # checking for unchecked errors, these unchecked errors can be critical bugs in some cases
  • errname # checks that sentinel errors are prefixed with the Err and error types are suffixed with the Error
  • errorlint # finds code that will cause problems with the error wrapping scheme introduced in Go 1.13
  • exhaustive # checks exhaustiveness of enum switch statements
  • exptostd # detects functions from golang.org/x/exp/ that can be replaced by std functions
  • fatcontext # detects nested contexts in loops
  • forbidigo # forbids identifiers
  • funcorder # checks the order of functions, methods, and constructors
  • funlen # tool for detection of long functions
  • gocheckcompilerdirectives # validates go compiler directive comments (//go:)
  • gochecknoglobals # checks that no global variables exist
  • gochecknoinits # checks that no init functions are present in Go code
  • gochecksumtype # checks exhaustiveness on Go "sum types"
  • gocognit # computes and checks the cognitive complexity of functions
  • goconst # finds repeated strings that could be replaced by a constant
  • gocritic # provides diagnostics that check for bugs, performance and style issues
  • gocyclo # computes and checks the cyclomatic complexity of functions
  • godoclint # checks Golang's documentation practice
  • godot # checks if comments end in a period
  • gomoddirectives # manages the use of 'replace', 'retract', and 'excludes' directives in go.mod
  • goprintffuncname # checks that printf-like functions are named with f at the end
  • gosec # inspects source code for security problems
  • govet # reports suspicious constructs, such as Printf calls whose arguments do not align with the format string
  • iface # checks the incorrect use of interfaces, helping developers avoid interface pollution
  • ineffassign # detects when assignments to existing variables are not used
  • intrange # finds places where for loops could make use of an integer range
  • iotamixing # checks if iotas are being used in const blocks with other non-iota declarations
  • loggercheck # checks key value pairs for common logger libraries (kitlog,klog,logr,zap)
  • makezero # finds slice declarations with non-zero initial length
  • mirror # reports wrong mirror patterns of bytes/strings usage
  • mnd # detects magic numbers
  • musttag # enforces field tags in (un)marshaled structs
  • nakedret # finds naked returns in functions greater than a specified function length
  • nestif # reports deeply nested if statements
  • nilerr # finds the code that returns nil even if it checks that the error is not nil
  • nilnesserr # reports that it checks for err != nil, but it returns a different nil value error (powered by nilness and nilerr)
  • nilnil # checks that there is no simultaneous return of nil error and an invalid value
  • noctx # finds sending http request without context.Context
  • nolintlint # reports ill-formed or insufficient nolint directives
  • nonamedreturns # reports all named returns
  • nosprintfhostport # checks for misuse of Sprintf to construct a host with port in a URL
  • perfsprint # checks that fmt.Sprintf can be replaced with a faster alternative
  • predeclared # finds code that shadows one of Go's predeclared identifiers
  • promlinter # checks Prometheus metrics naming via promlint
  • protogetter # reports direct reads from proto message fields when getters should be used
  • reassign # checks that package variables are not reassigned
  • recvcheck # checks for receiver type consistency
  • revive # fast, configurable, extensible, flexible, and beautiful linter for Go, drop-in replacement of golint
  • rowserrcheck # checks whether Err of rows is checked successfully
  • sloglint # ensure consistent code style when using log/slog
  • spancheck # checks for mistakes with OpenTelemetry/Census spans
  • sqlclosecheck # checks that sql.Rows and sql.Stmt are closed
  • staticcheck # is a go vet on steroids, applying a ton of static analysis checks
  • testableexamples # checks if examples are testable (have an expected output)
  • testifylint # checks usage of github.com/stretchr/testify
  • testpackage # makes you use a separate _test package
  • tparallel # detects inappropriate usage of t.Parallel() method in your Go test codes
  • unconvert # removes unnecessary type conversions
  • unparam # reports unused function parameters
  • unqueryvet # detects SELECT * in SQL queries and SQL builders, encouraging explicit column selection
  • unused # checks for unused constants, variables, functions and types
  • usestdlibvars # detects the possibility to use variables/constants from the Go standard library
  • usetesting # reports uses of functions with replacement inside the testing package
  • wastedassign # finds wasted assignment statements
  • whitespace # detects leading and trailing whitespace

May want to enable:

  • decorder # checks declaration order and count of types, constants, variables and functions
  • exhaustruct # [highly recommend to enable] checks if all structure fields are initialized
  • ginkgolinter # [if you use ginkgo/gomega] enforces standards of using ginkgo and gomega
  • godox # detects usage of FIXME, TODO and other keywords inside comments
  • goheader # checks is file header matches to pattern
  • inamedparam # [great idea, but too strict, need to ignore a lot of cases by default] reports interfaces with unnamed method parameters
  • interfacebloat # checks the number of methods inside an interface
  • ireturn # accept interfaces, return concrete types
  • noinlineerr # disallows inline error handling if err := ...; err != nil {
  • prealloc # [premature optimization, but can be used in some cases] finds slice declarations that could potentially be preallocated
  • tagalign # checks that struct tags are well aligned
  • varnamelen # [great idea, but too many false positives] checks that the length of a variable's name matches its scope
  • wrapcheck # checks that errors returned from external packages are wrapped
  • zerologlint # detects the wrong usage of zerolog that a user forgets to dispatch zerolog.Event

Sub-issues

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions