Why should I use a lint?
- Readability
- Maintainability
- Help the code review process
- Avoid (syntax) issues
- Ensure stiles and standards
- Following the good practices
Linter for Golang
I’d like to suggest to use:

To Install
# binary will be $(go env GOPATH)/bin/golangci-lint
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.30.0
golangci-lint --version
More info and options: https://golangci-lint.run/usage/install/
To Run


Use GitHub Actions to integrate it with your CI

See its demonstration: https://github.com/dev4devs-com/lintpoc/pull/2/files
How to Configure
Add in the root directory of your project the .golangci.yml file with its rules:

Check it in the lintpoc project: https://github.com/dev4devs-com/lintpoc/blob/master/.golangci.yml
How to enable it on the CI with GitHub Actions:
Create the file `.github/workflows/golangci-lint.yml` with the following content. It will use the configuration in the root directory and will perform the checks.
name: golangci-lint on: push: tags: - v* branches: - master pull_request: jobs: golangci: name: lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: golangci-lint uses: golangci/golangci-lint-action@v1 with: # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. version: v1.29 # Optional: working directory, useful for monorepos # working-directory: somedir # Optional: golangci-lint command line arguments. # args: --issues-exit-code=0 # Optional: show only new issues if it's a pull request. The default value is `false`. # only-new-issues: true
Suggestion: Configure it to allow you check the lint locally via Makefile:
lint: golangci-lint ## Run golint @$(GOLANGCI_LINT) run
To install the lint in the bin/ dir of the project:
golangci-lint: ifeq (, $(shell which golangci-lint)) @{ \ set -e ;\ curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(shell go env GOPATH)/bin v1.29.0 ;\ } GOLANGCI_LINT=$(shell go env GOPATH)/bin/golangci-lint else GOLANGCI_LINT=$(shell which golangci-lint) endif
**NOTE:** It is NOT a good practice commit binaries. In this way, do not forget to add in the .gitignore:
bin/*
Tips
Use the flag –fix to automatically fix some checks and issues:
golangci-lint run --fix
See that you can setup this helper in your Makefile as well:
lint-fix: golangci-lint ## Run golint fix @$(GOLANGCI_LINT) run --fix
How to ignore the false positives and to deal with exceptions:
To ignore specific checks into specific areas of your code :
// nolint:<checkName>
Example:

Also, you can perform configurations in the .golangci.yml to ignore directories, files and etc. Also, it can be very specific such as; for the check N in the files A,B,C ignore the errors with “X” see:

Demo Project:
The following project was created to help you with and let you know how it works. Feel free to check: