Accept Interfaces, Return Concrete Types
You can get ireturn
with go install
command.
go install github.com/butuzov/ireturn/cmd/ireturn
Or you can download the suitable binary from the releases section.
ireturn
work with two arguments (but allow to use of only one of them in the same moment):
accept
- accept-list of the comma-separated interfaces.reject
- reject-list of the comma-separated interfaces.
By default, ireturn
will accept all errors (error
), empty interfaces (interfaces{}
), anonymous interfaces declarations ( interface { methodName() }
), and interfaces from standard library as a valid ones.
Interfaces in the list can be provided as regexps or keywords ("error" for "error", "empty" for interface{}
, anon
for anonymous interfaces):
# allow usage of empty interfaces, errors and Doer interface from any package.
ireturn --accpet="\\.Doer,error,empty" ./...
# reject standard library interfaces and plinko.Payload as valid ones
ireturn --reject="std,github.com/shipt/plinko.Payload" ./...
# default settings allows errors, empty interfaces, anonymous declarations and standard library
ireturn ./..
# checkfor non idiomatic interface names
ireturn -allow="error,empty,anon,stdlib,.*(or|er)$" ./...
You can use shorthand for some types of interfaces:
error
forerror
typeempty
forinterface{}
typeanon
for anonymous declarationsinterface{ someMethod() }
std
for all interfaces from standard library.
golangci-lint
compliant disable directive //nolint: ireturn
can be used with ireturn
- uses: butuzov/ireturn-linter@main
with:
allow: "error,empty"
// Bad.
type Doer interface { Doer() }
type doer struct{}
func New() Doer { return new(doer)}
func (d *doer) Do() {/*...*/}
// Good.
type Doer interface { Doer() }
type doer struct{}
func New() *doer { return new(doer)}
func (d *doer) Do() {/*...*/}
// Very Good (Verify Interface Compliance in compile time)
var _ Doer = (*doer)(nil)
type Doer interface { Doer() }
type doer struct{}
func New() *doer { return new(doer)}
func (d *doer) Do() {/*...*/}