Don't mix receiver types. Choose either pointers or struct types for all available methods.
Go has rules on how it automatically selects either value or method receivers, which is complex and can lead to bugs. Therefore, it is a common style recommendation12.
go install github.com/nikolaydubina/smrcptr@latest
type Pancake struct{}
func NewPancake() Pancake { return Pancake{} }
func (s *Pancake) Fry() {}
func (s Pancake) Bake() {}
$ smrcptr ./...
/pancake.go:12:1: Pancake.Fry uses pointer
/pancake.go:10:1: Pancake.NewPancake uses value
/pancake.go:14:1: Pancake.Bake uses value
As of 2022-11-30
, it does not detect that pointer and value method receivers are mixed.
Most relevant analyzer ST1016
checks only name of method receiver.
$ staticcheck -checks ST1016 ./...
main.go:9:18: methods on the same type should have the same receiver name (seen 1x "v", 2x "s") (ST1016)
Using all analyzers does not detect it either.
staticcheck -checks all ./...
main.go:9:18: methods on the same type should have the same receiver name (seen 1x "v", 2x "s") (ST1016)
- https://github.com/golang/go/wiki/CodeReviewComments#receiver-type
- https://golang.org/ref/spec#Method_declarations
- https://golangci-lint.run/usage/linters/
- https://github.com/dominikh/go-tools/blob/master/stylecheck/lint.go#L295
- https://github.com/dominikh/go-tools/tree/master/stylecheck/testdata/src/CheckReceiverNamesIdentical
- https://google.github.io/styleguide/go/decisions#receiver-type
- dominikh/go-tools#911