errcheck is a program for checking for unchecked errors in go programs.
go get -u github.com/kisielk/errcheck
errcheck requires Go 1.12 or newer, and depends on the package go/packages from the golang.org/x/tools repository.
For basic usage, just give the package path of interest as the first argument:
To check all packages beneath the current directory:
Or check all packages in your $GOPATH and $GOROOT:
errcheck also recognizes the following command-line options:
-tags flag takes a space-separated list of build tags, just like
go build. If you are using any custom build tags in your code base, you may need to specify the relevant tags here.
-asserts flag enables checking for ignored type assertion results. It takes no arguments.
-blank flag enables checking for assignments of errors to the blank identifier. It takes no arguments.
-exclude flag to specify a path to a file containing a list of functions to be excluded.
errcheck -exclude errcheck_excludes.txt path/to/package
The file should contain one function signature per line. The format for function signatures is
package.FunctionName while for methods it's
(package.Receiver).MethodName for value receivers and
(*package.Receiver).MethodName for pointer receivers. If the function name is followed by string of form
(TYPE), then the the function call is excluded only if the type of the first argument is
TYPE. It also accepts a special suffix
(os.Stderr), which excludes the function only when the first argument is a literal
An example of an exclude file is:
io/ioutil.ReadFile io.Copy(*bytes.Buffer) io.Copy(os.Stdout) // Sometimes we don't care if a HTTP request fails. (*net/http.Client).Do
By default, the exclude list is combined with an internal list for functions in the Go standard library that have an error return type but are documented to never return an error. To disable the built-in exclude list, pass the
Run errcheck in
-verbose mode to see the resulting list of added excludes.
When using vendored dependencies, specify the full import path. For example:
- Your project's import path is
- You've vendored
- You want to exclude
fmt2.Printlnfrom error checking
In this case, add this line to your exclude file:
Empty lines and lines starting with
// are ignored.
The deprecated method
-ignore flag takes a comma-separated list of pairs of the form package:regex. For each package, the regex describes which functions to ignore within that package. The package may be omitted to have the regex apply to all packages.
For example, you may wish to ignore common operations like Read and Write:
errcheck -ignore '[rR]ead|[wW]rite' path/to/package
or you may wish to ignore common functions like the
errcheck -ignore 'fmt:[FS]?[Pp]rint*' path/to/package
-ignorepkg flag takes a comma-separated list of package import paths to ignore:
errcheck -ignorepkg 'fmt,encoding/binary' path/to/package
Note that this is equivalent to:
errcheck -ignore 'fmt:.*,encoding/binary:.*' path/to/package
If a regex is provided for a package
pkg also appears in the list of packages passed to
-ignorepkg, the latter takes precedence; that is, all functions within
pkg will be ignored.
Note that by default the
fmt package is ignored entirely, unless a regex is specified for it. To disable this, specify a regex that matches nothing:
errcheck -ignore 'fmt:a^' path/to/package
-ignoretests flag disables checking of
_test.go files. It takes no arguments.
errcheck returns 1 if any problems were found in the checked files. It returns 2 if there were any other failures.
go-errcheck.el integrates errcheck with Emacs by providing a
go-errcheck command and customizable variables to automatically pass flags to errcheck.
vim-go can run errcheck via both its