首页 > 解决方案 > 将方法转换为 func var

问题描述

为什么将方法分配给函数处理程序有效。

短链接: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())
}

func()float64 == func(T)float64 或其他东西是 Golang 类型检查“功能”吗?请帮助理解这个概念。

标签: go

解决方案


v.Abs是一个方法值,并引用规范:

方法值x.M是一个函数值,可以使用与 的方法调用相同的参数进行调用x.M

方法值具有与没有接收者的方法具有相同参数和结果类型的函数类型。


推荐阅读