函数值-学习Go语言

阅读笔记

functions-values.go

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))
}

笔记

函数也是值。它们可以像其它值一样传递。
函数值可以用作函数的参数或返回值。
1. 函数可以传值进去
2. 5 12 的平方根 = 13
3. (fn func(float64, float64) float64) 包含起来会好理解些,可以认为是一个申明。

functions-closures.go

package main

import "fmt"

func adder() func(int) int {
    sum := 0
    return func(x int) int {
        sum += x
        return sum
    }
}

func main() {
    pos, neg := adder(), adder()
    for i := 0; i < 10; i++ {
        fmt.Println(
            pos(i),
            neg(-2*i),
        )
    }
}

笔记

  1. Go 函数可以是一个闭包。闭包是一个函数值,它引用了其函数体之外的变量。该函数可以访问并赋予其引用的变量的值,换句话说,该函数被“绑定”在了这些变量上。
  2. 可以想一想JavaScirpt的闭包概念,和Go的闭包是不是有一些类似?

参考链接

  1. 函数值
  2. 函数的闭包

发表评论

电子邮件地址不会被公开。 必填项已用*标注