New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

Configuration File

Golangci-lint looks for config files in the following paths from the current working directory:

  • .golangci.yml
  • .golangci.yaml
  • .golangci.toml
  • .golangci.json

Golangci-lint also searches for config files in all directories from the directory of the first analyzed path up to the root. If no configuration file has been found, golangci-lint will try to find one in your home directory. To see which config file is being used and where it was sourced from run golangci-lint with -v option.

Config options inside the file are identical to command-line options. You can configure specific linters’ options only within the config file (not the command-line).

There is a .golangci.reference.yml file with all supported options, their descriptions, and default values. This file is neither a working example nor a recommended configuration, it’s just a reference to display all the configuration options used to generate the documentation.

The configuration file can be validated with the JSON Schema: golangci.jsonschema.json

# See the dedicated "version" documentation section. version: "2" linters:  # See the dedicated "linters" documentation section.  option: value formatters:  # See the dedicated "formatters" documentation section.  option: value issues:  # See the dedicated "issues" documentation section.  option: value # Output configuration options. output:  # See the dedicated "output" documentation section.  option: value # Options for analysis running. run:  # See the dedicated "run" documentation section.  option: value severity:  # See the dedicated "severity" documentation section.  option: value

version configuration

# Defines the configuration version. # The only possible value is "2". version: "2"

linters configuration

linters:  # Default set of linters.  # The value can be:  # - `standard`: https://golangci-lint.run/docs/linters/#enabled-by-default  # - `all`: enables all linters by default.  # - `none`: disables all linters by default.  # - `fast`: enables only linters considered as "fast" (`golangci-lint help linters --json | jq '[ .[] | select(.fast==true) ] | map(.name)'`).  # Default: standard  default: all  # Enable specific linter.  enable:  - arangolint  - asasalint  - asciicheck  - bidichk  - bodyclose  - canonicalheader  - containedctx  - contextcheck  - copyloopvar  - cyclop  - decorder  - depguard  - dogsled  - dupl  - dupword  - durationcheck  - embeddedstructfieldcheck  - err113  - errcheck  - errchkjson  - errname  - errorlint  - exhaustive  - exhaustruct  - exptostd  - fatcontext  - forbidigo  - forcetypeassert  - funcorder  - funlen  - ginkgolinter  - gocheckcompilerdirectives  - gochecknoglobals  - gochecknoinits  - gochecksumtype  - gocognit  - goconst  - gocritic  - gocyclo  - godoclint  - godot  - godox  - goheader  - gomoddirectives  - gomodguard  - goprintffuncname  - gosec  - gosmopolitan  - govet  - grouper  - iface  - importas  - inamedparam  - ineffassign  - interfacebloat  - intrange  - iotamixing  - ireturn  - lll  - loggercheck  - maintidx  - makezero  - mirror  - misspell  - mnd  - musttag  - nakedret  - nestif  - nilerr  - nilnesserr  - nilnil  - nlreturn  - noctx  - noinlineerr  - nolintlint  - nonamedreturns  - nosprintfhostport  - paralleltest  - perfsprint  - prealloc  - predeclared  - promlinter  - protogetter  - reassign  - recvcheck  - revive  - rowserrcheck  - sloglint  - spancheck  - sqlclosecheck  - staticcheck  - tagalign  - tagliatelle  - testableexamples  - testifylint  - testpackage  - thelper  - tparallel  - unconvert  - unparam  - unqueryvet  - unused  - usestdlibvars  - usetesting  - varnamelen  - wastedassign  - whitespace  - wrapcheck  - wsl  - wsl_v5  - zerologlint  # Disable specific linters.  disable:  - arangolint  - asasalint  - asciicheck  - bidichk  - bodyclose  - canonicalheader  - containedctx  - contextcheck  - copyloopvar  - cyclop  - decorder  - depguard  - dogsled  - dupl  - dupword  - durationcheck  - embeddedstructfieldcheck  - err113  - errcheck  - errchkjson  - errname  - errorlint  - exhaustive  - exhaustruct  - exptostd  - fatcontext  - forbidigo  - forcetypeassert  - funcorder  - funlen  - ginkgolinter  - gocheckcompilerdirectives  - gochecknoglobals  - gochecknoinits  - gochecksumtype  - gocognit  - goconst  - gocritic  - gocyclo  - godoclint  - godot  - godox  - goheader  - gomoddirectives  - gomodguard  - goprintffuncname  - gosec  - gosmopolitan  - govet  - grouper  - iface  - importas  - inamedparam  - ineffassign  - interfacebloat  - intrange  - iotamixing  - ireturn  - lll  - loggercheck  - maintidx  - makezero  - mirror  - misspell  - mnd  - musttag  - nakedret  - nestif  - nilerr  - nilnesserr  - nilnil  - nlreturn  - noctx  - noinlineerr  - nolintlint  - nonamedreturns  - nosprintfhostport  - paralleltest  - perfsprint  - prealloc  - predeclared  - promlinter  - protogetter  - reassign  - recvcheck  - revive  - rowserrcheck  - sloglint  - spancheck  - sqlclosecheck  - staticcheck  - tagalign  - tagliatelle  - testableexamples  - testifylint  - testpackage  - thelper  - tparallel  - unconvert  - unparam  - unqueryvet  - unused  - usestdlibvars  - usetesting  - varnamelen  - wastedassign  - whitespace  - wrapcheck  - wsl  - wsl_v5  - zerologlint  # All available settings of specific linters.  settings:  # See the dedicated "linters.settings" documentation section.  option: value  # Defines a set of rules to ignore issues.  # It does not skip the analysis, and so does not ignore "typecheck" errors.  exclusions:  # Mode of the generated files analysis.  #  # - `strict`: sources are excluded by strictly following the Go generated file convention.  # Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\.$`  # This line must appear before the first non-comment, non-blank text in the file.  # https://go.dev/s/generatedcode  # - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc.  # - `disable`: disable the generated files exclusion.  #  # Default: strict  generated: lax  # Log a warning if an exclusion rule is unused.  # Default: false  warn-unused: true  # Predefined exclusion rules.  # Default: []  presets:  - comments  - std-error-handling  - common-false-positives  - legacy  # Excluding configuration per-path, per-linter, per-text and per-source.  rules:  # Exclude some linters from running on tests files.  - path: _test\.go  linters:  - gocyclo  - errcheck  - dupl  - gosec  # Run some linter only for test files by excluding its issues for everything else.  - path-except: _test\.go  linters:  - forbidigo  # Exclude known linters from partially hard-vendored code,  # which is impossible to exclude via `nolint` comments.  # `/` will be replaced by the current OS file path separator to properly work on Windows.  - path: internal/hmac/  text: "weak cryptographic primitive"  linters:  - gosec  # Exclude some `staticcheck` messages.  - linters:  - staticcheck  text: "SA9003:"  # Exclude `lll` issues for long lines with `go:generate`.  - linters:  - lll  source: "^//go:generate "  # Which file paths to exclude: they will be analyzed, but issues from them won't be reported.  # "/" will be replaced by the current OS file path separator to properly work on Windows.  # Default: []  paths:  - ".*\\.my\\.go$"  - lib/bad.go  # Which file paths to not exclude.  # Default: []  paths-except:  - ".*\\.my\\.go$"  - lib/bad.go

formatters configuration

formatters:  # Enable specific formatter.  # Default: [] (uses standard Go formatting)  enable:  - gci  - gofmt  - gofumpt  - goimports  - golines  - swaggo  # Formatters settings.  settings:  # See the dedicated "formatters.settings" documentation section.  option: value  exclusions:  # Log a warning if an exclusion path is unused.  # Default: false  warn-unused: true  # Mode of the generated files analysis.  #  # - `strict`: sources are excluded by strictly following the Go generated file convention.  # Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\.$`  # This line must appear before the first non-comment, non-blank text in the file.  # https://go.dev/s/generatedcode  # - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc.  # - `disable`: disable the generated files exclusion.  #  # Default: lax  generated: strict  # Which file paths to exclude.  # This option is ignored when using `--stdin` as the path is unknown.  # Default: []  paths:  - ".*\\.my\\.go$"  - lib/bad.go

issues configuration

issues:  # Maximum issues count per one linter.  # Set to 0 to disable.  # Default: 50  max-issues-per-linter: 0  # Maximum count of issues with the same text.  # Set to 0 to disable.  # Default: 3  max-same-issues: 0  # Make issues output unique by line.  # Default: true  uniq-by-line: false  # Show only new issues: if there are unstaged changes or untracked files,  # only those changes are analyzed, else only changes in HEAD~ are analyzed.  # It's a super-useful option for integration of golangci-lint into existing large codebase.  # It's not practical to fix all existing issues at the moment of integration:  # much better don't allow issues in new code.  #  # Default: false  new: true  # Show only new issues created after the best common ancestor (merge-base against HEAD).  # Default: ""  new-from-merge-base: main  # Show only new issues created after git revision `REV`.  # Default: ""  new-from-rev: HEAD  # Show only new issues created in git patch with set file path.  # Default: ""  new-from-patch: path/to/patch/file  # Show issues in any part of update files (requires new-from-rev or new-from-patch).  # Default: false  whole-files: true  # Fix found issues (if it's supported by the linter).  # Default: false  fix: true

output configuration

# Output configuration options. output:  # The formats used to render issues.  formats:  # Prints issues in a text format with colors, line number, and linter name.  # This format is the default format.  text:  # Output path can be either `stdout`, `stderr` or path to the file to write to.  # Default: stdout  path: ./path/to/output.txt  # Print linter name in the end of issue text.  # Default: true  print-linter-name: false  # Print lines of code with issue.  # Default: true  print-issued-lines: false  # Use colors.  # Default: true  colors: false  # Prints issues in a JSON representation.  json:  # Output path can be either `stdout`, `stderr` or path to the file to write to.  # Default: stdout  path: ./path/to/output.json  # Prints issues in columns representation separated by tabulations.  tab:  # Output path can be either `stdout`, `stderr` or path to the file to write to.  # Default: stdout  path: ./path/to/output.txt  # Print linter name in the end of issue text.  # Default: true  print-linter-name: true  # Use colors.  # Default: true  colors: false  # Prints issues in an HTML page.  # It uses the Cloudflare CDN (cdnjs) and React.  html:  # Output path can be either `stdout`, `stderr` or path to the file to write to.  # Default: stdout  path: ./path/to/output.html  # Prints issues in the Checkstyle format.  checkstyle:  # Output path can be either `stdout`, `stderr` or path to the file to write to.  # Default: stdout  path: ./path/to/output.xml  # Prints issues in the Code Climate format.  code-climate:  # Output path can be either `stdout`, `stderr` or path to the file to write to.  # Default: stdout  path: ./path/to/output.json  # Prints issues in the JUnit XML format.  junit-xml:  # Output path can be either `stdout`, `stderr` or path to the file to write to.  # Default: stdout  path: ./path/to/output.xml  # Support extra JUnit XML fields.  # Default: false  extended: true  # Prints issues in the TeamCity format.  teamcity:  # Output path can be either `stdout`, `stderr` or path to the file to write to.  # Default: stdout  path: ./path/to/output.txt  # Prints issues in the SARIF format.  sarif:  # Output path can be either `stdout`, `stderr` or path to the file to write to.  # Default: stdout  path: ./path/to/output.json  # Add a prefix to the output file references.  # This option is ignored when using `output.path-mode: abs` mode.  # Default: ""  path-prefix: ""  # By default, the report are related to the path obtained by `run.relative-path-mode`.  # The mode `abs` allows to show absolute file paths instead of relative file paths.  # The option `output.path-prefix` is ignored when using `abs` mode.  # Default: ""  path-mode: "abs"  # Order to use when sorting results.  # Possible values: `file`, `linter`, and `severity`.  #  # If the severity values are inside the following list, they are ordered in this order:  # 1. error  # 2. warning  # 3. high  # 4. medium  # 5. low  # Either they are sorted alphabetically.  #  # Default: ["linter", "file"]  sort-order:  - linter  - severity  - file # filepath, line, and column.  # Show statistics per linter.  # Default: true  show-stats: false

run configuration

# Options for analysis running. run:  # Timeout for total work, e.g. 30s, 5m, 5m30s.  # If the value is lower or equal to 0, the timeout is disabled.  # Default: 0 (disabled)  timeout: 5m  # The mode used to evaluate relative paths.  # It's used by exclusions, Go plugins, and some linters.  # The value can be:  # - `gomod`: the paths will be relative to the directory of the `go.mod` file.  # - `gitroot`: the paths will be relative to the git root (the parent directory of `.git`).  # - `cfg`: the paths will be relative to the configuration file.  # - `wd` (NOT recommended): the paths will be relative to the place where golangci-lint is run.  # Default: cfg  relative-path-mode: gomod  # Exit code when at least one issue was found.  # Default: 1  issues-exit-code: 2  # Include test files or not.  # Default: true  tests: false  # List of build tags, all linters use it.  # Default: []  build-tags:  - mytag  # If set, we pass it to "go list -mod={option}". From "go help modules":  # If invoked with -mod=readonly, the go command is disallowed from the implicit  # automatic updating of go.mod described above. Instead, it fails when any changes  # to go.mod are needed. This setting is most useful to check that go.mod does  # not need updates, such as in a continuous integration and testing system.  # If invoked with -mod=vendor, the go command assumes that the vendor  # directory holds the correct copies of dependencies and ignores  # the dependency descriptions in go.mod.  #  # Allowed values: readonly|vendor|mod  # Default: ""  modules-download-mode: readonly  # Allow multiple parallel golangci-lint instances running.  # If false, golangci-lint acquires file lock on start.  # Default: false  allow-parallel-runners: true  # Allow multiple golangci-lint instances running, but serialize them around a lock.  # If false, golangci-lint exits with an error if it fails to acquire file lock on start.  # Default: false  allow-serial-runners: true  # Define the Go version limit.  # Default: use Go version from the go.mod file, fallback on the env var `GOVERSION`, fallback on 1.22.  go: '1.23'  # Number of operating system threads (`GOMAXPROCS`) that can execute golangci-lint simultaneously.  # Default: 0 (automatically set to match Linux container CPU quota and  # fall back to the number of logical CPUs in the machine)  concurrency: 4

severity configuration

severity:  # Set the default severity for issues.  #  # If severity rules are defined and the issues do not match or no severity is provided to the rule  # this will be the default severity applied.  # Severities should match the supported severity names of the selected out format.  # - Code climate: https://docs.codeclimate.com/docs/issues#issue-severity  # - Checkstyle: https://checkstyle.sourceforge.io/property_types.html#SeverityLevel  # - GitHub: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message  # - TeamCity: https://www.jetbrains.com/help/teamcity/service-messages.html#Inspection+Instance  #  # `@linter` can be used as severity value to keep the severity from linters (e.g. revive, gosec, ...)  #  # Default: ""  default: error  # When a list of severity rules are provided, severity information will be added to lint issues.  # Severity rules have the same filtering capability as exclude rules  # except you are allowed to specify one matcher per severity rule.  #  # `@linter` can be used as severity value to keep the severity from linters (e.g. revive, gosec, ...)  #  # Only affects out formats that support setting severity information.  #  # Default: []  rules:  - linters:  - dupl  severity: info
Last updated on