Accept Interfaces, Return Concrete Types
You can get ireturn with go install command. Go1.23+ required.
go install github.com/butuzov/ireturn/cmd/ireturn@latestOr 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:
emptyforinterface{}typeanonfor anonymous declarationsinterface{ someMethod() }errorforerrortypestdlibfor all interfaces from standard library.genericfor 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() {/*...*/}