0

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.

  • Possible duplicate of [golang function alias on method receiver](https://stackoverflow.com/questions/28251283/golang-function-alias-on-method-receiver/28252088#28252088). – icza Jan 25 '19 at 08:44
  • I see certain similarities between my example and the possible duplicate but in my case I am specifically assigning a method to a function var. In case of the possible duplicate they just create method handler and they assign method on receiver to it. – user10966222 Jan 25 '19 at 08:52

1 Answers1

1

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 of x.M.

A method value has a function type with identical parameter and result types as the method without the receiver.

icza
  • 389,944
  • 63
  • 907
  • 827