函数值

Go 语言,函数也是一种值( C++ 函数对象、 Python 函数类似),可以被传递。

跟其他普通值一样,函数也可以作为 参数 传递或作为 返回值 返回。

/_src/tour/function-values.go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
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))
}

闭包

Go 函数 可以是 闭包 。 闭包是指一个引用外部变量的 函数值 (函数对象)。 闭包函数可以访问外部变量,也可以为其赋值。 如此看来,闭包函数相当于与外部变量绑在一起。

/_src/tour/function-closures.go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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),
        )
    }
}

这个例子, adder 函数返回了一个闭包函数。 每个闭包函数都与自己的 sum 变量绑定,互相独立。

练习

1. 斐波那契数列

接下来做运用函数知识做一些有趣的事情:

实现一个函数 fibonacci ,返回一个闭包函数。 每次调用该闭包函数时,均返回下一个斐波那契数(从零开始)。

代码框架如下:

/_src/tour/exercise-fibonacci-closure.go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package main

import "fmt"

// fabonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
}

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}

答案

/_src/tour/solution-fibonacci-closure.go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import "fmt"

// fabonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
    a, b := 0, 1
    return func() int {
        value := a
        a, b = b, a+b
        return value
    }
}

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}

下一步

下一节 我们一起来看看 Go 语言 方法

订阅更新,获取更多学习资料,请关注我们的 微信公众号

../_images/wechat-mp-qrcode.png

小菜学编程

微信打赏