Accept Interfaces, Return Concrete Types
You can get ireturn
with go install
command. Go1.18+ required.
go install github.com/butuzov/ireturn/cmd/ireturn@latest
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 --accept="\\.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,generic,anon,stdlib,.*(or|er)$" ./...
You can use shorthand for some types of interfaces:
empty
forinterface{}
typeanon
for anonymous declarationsinterface{ someMethod() }
error
forerror
typestdlib
for all interfaces from standard library.generic
for generic interfaces (added in go1.18)
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 { Do() }
type IDoer struct{}
func New() Doer { return new(IDoer)}
func (d *IDoer) Do() {/*...*/}
// Good.
type Doer interface { Do() }
type IDoer struct{}
func New() *IDoer { return new(IDoer)}
func (d *IDoer) Do() {/*...*/}
// Very Good (Verify Interface Compliance in compile time)
var _ Doer = (*IDoer)(nil)
type Doer interface { Do() }
type IDoer struct{}
func New() *IDoer { return new(IDoer)}
func (d *IDoer) Do() {/*...*/}