Given the setup in the 54th slide of the golang tour:
type Abser interface {
Abs() float64
}
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
Why can't a method also be defined for the struct as well as the pointer to the struct? That is:
func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
Defining this gives the following error:
prog.go:41: method redeclared: Vertex.Abs
method(*Vertex) func() float64
method(Vertex) func() float64
While considering for example:
...we can now invoke
M()
ont
by writingt.M()
as the language permits to call a method with a pointer receiver even on its underlying (non pointer) typed instances, i.e. it becomes equivalent to(&t).M()
.If it will be permitted to now additionaly define:
...then there's no way to tell what is now
t.M()
supposed to return.It can. Just define it on the struct and not the pointer. It will resolve both ways
Method Sets
Try live: http://play.golang.org/p/PsNUerVyqp
Update: As per comments I have created an extra example that actually makes use of the
Abser
interface to illustrate that both the value and the pointer satisfy the interface.https://play.golang.org/p/Mls0d7_l4_t