Метод приведения к func var - PullRequest
0 голосов
/ 25 января 2019

Почему назначение метода для обработчика функции работает.

короткая ссылка: 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())
}

Это функция проверки типа Golang, которая func () float64 == func (T) float64 или что-то еще? Пожалуйста, помогите понять эту концепцию.

1 Ответ

0 голосов
/ 25 января 2019

v.Abs - это значение метода , и цитата из спецификации:

Значение метода x.M - это значение функции , то естьможет вызываться с теми же аргументами, что и вызов метода x.M.

Значение метода имеет тип функции с такими же параметрами и типами результатов, как у метода без получателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...