go-errorlint is a source code linter for Go software that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13.
Error wrapping allows for extra context in errors without sacrificing type information about the error's cause.
For details on Go error wrapping, see: https://golang.org/pkg/errors/
go-errorlint accepts a set of package names similar to golint:
go-errorlint ./...
If there are one or more results, the exit status is set to 1
.
Caveats:
- When using the
-errorf
lint, keep in mind that any errors wrapped byfmt.Errorf
implicitly become part of your API as according to Hyrum's Law.
This lint must be enabled with the -errorf
flag.
// bad
fmt.Errorf("oh noes: %v", err)
// ^ non-wrapping format verb for fmt.Errorf. Use `%w` to format errors
// good
fmt.Errorf("oh noes: %w", err)
// bad
err == ErrFoo
// ^ comparing with == will fail on wrapped errors. Use errors.Is to check for a specific error
// good
errors.Is(err, ErrFoo)
Switch statements are also checked.
// bad
myErr, ok := err.(*MyError)
// ^ type assertion on error will fail on wrapped errors. Use errors.As to check for specific errors
// good
var me MyError
ok := errors.As(err, &me)
Type switch statements are also checked.