Может кто-нибудь объяснить код вычисления (fn func ()) на веб-сайте Go Tour? - PullRequest
0 голосов
/ 21 сентября 2018
package main

import (
    "fmt"
    "math"
)

func compute(fn func(float64, float64) float64) float64 {
    return fn(3, 4)
}

func main() {
    hypot := func(x, y float64) float64 {
        return math.Sqrt(x*x + y*y)
    }
    fmt.Println(hypot(5, 12))

    fmt.Println(compute(hypot))
    fmt.Println(compute(math.Pow))
}

Является ли функция fn () внутри функции ??Может кто-нибудь помочь с тем, что именно здесь делает func compute?И я совсем новичок в программировании GO.

1 Ответ

0 голосов
/ 21 сентября 2018

Замыкание - это значение функции, которое ссылается на переменные вне его тела.Функция может получать доступ и присваивать ссылочные переменные;в этом смысле функция «привязана» к переменным.

В вашем случае compute содержит функцию замыкания.Функция передается функции compute в качестве аргумента, возвращаемое значение которого равно float64, которое затем вызывается в функции вычисления.

func compute(fn func(float64, float64) float64) float64 {
     return fn(3, 4) // calling the function.
}

Поскольку существуют две функции, созданные с одинаковым числом аргументов, одиниз которых hypot.

hypot := func(x, y float64) float64 {
    return math.Sqrt(x*x + y*y)
}

, который принимает два значения float64 в качестве аргумента, а затем возвращает значение float64, в то время как другая функция находится в пакете mathgolang, который равен math.pow

func Pow(x, y float64) float64 // Pow returns x**y, the base-x exponential of y. 

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

Возьмем пример для Go Playground

...