Reputation: 11
Why assigning a method to function handler works.
shortlink: https://play.golang.org/p/UEYGCpMgyV6
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func Abs() float64 {
return math.Sqrt(10)
}
func AbsFloat(f float64) float64 {
return math.Sqrt(f)
}
func main() {
v := Vertex{3, 4}
// Assigning Abs() to func handler.
var absFunc func() float64 = Abs
fmt.Println(absFunc())
// Wrong type as expected.
//absFunc = AbsFloat
// Assigning method to func handler works, why ?
absFunc = v.Abs
// Changing receiver args. Useful for unittesting but why/how this works ?
v.X = 1
v.Y = 1
fmt.Println(absFunc())
}
Is it a Golang type checking 'feature' that func()float64 == func(T)float64 or something else ? Please help to understand this concept.
Upvotes: 0
Views: 48
Reputation: 417422
v.Abs
is a method value, and quoting from the spec:
The method value
x.M
is a function value that is callable with the same arguments as a method call ofx.M
.
A method value has a function type with identical parameter and result types as the method without the receiver.
Upvotes: 1