This is complicated by the fact that a struct method can have a pointer or a non-pointer receiver. They can't be mixed, but consider the following:
type Foo struct {}
type Bar interface {
Baz()
}
You could implement the interface either with a pointer receiver:
func (f *Foo) Baz() {...}
Or with a non-pointer receiver:
func (f Foo) Baz() {...}
Pointer receivers are more common for various reasons, but non-pointer receivers are still perfectly valid.
If you force interface arguments to be prefixed with a * then you end up with confusing usage depending on how you initialize the variable being passed and whether the interface was implemented using pointer receivers or not.
eg, for your ReadStuff example above, there are the following possibilities:
reader := SomeReader{}
pointerReader := &SomeReader{}
// SomeReader implements io.Reader with a pointer receiver
ReadStuff(&(&reader)) // This isn't actually valid, compiler will throw "cannot take the address of &reader"
ReadStuff(pointerReader)
// SomeReader implements io.Reader with a non-pointer receiver
ReadStuff(&reader)
ReadStuff(*pointerReader)
If you force interface arguments to be prefixed with a * then you end up with confusing usage depending on how you initialize the variable being passed and whether the interface was implemented using pointer receivers or not.
eg, for your ReadStuff example above, there are the following possibilities: