Skip to content

detect mixing pointer and value method receivers

License

Notifications You must be signed in to change notification settings

nikolaydubina/smrcptr

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Same Receiver Pointer (smrcptr)

go-recipes Go Report Card OpenSSF Scorecard

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

Existing Linters

staticcheck

As of 2022-11-30, it does not detect that pointer and value method receivers are mixed. Most relevant analyzser ST1016 checks only name of method reciver.

$ 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)

References

Footnotes

  1. Go wiki https://github.com/golang/go/wiki/CodeReviewComments#receiver-type

  2. Google Go style guide https://google.github.io/styleguide/go/decisions#receiver-type