Go 语言中的函数也是一种值,可以被传递,跟 C++ 函数对象、 Python 函数类似。
跟其他普通值一样,函数也可以作为 参数 传递或作为 返回值 返回。
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
 | 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 函数 可以是 闭包 ( closure )。 闭包是指一个引用外部变量的函数值(函数对象)。闭包函数可以访问外部变量,也可以为其赋值。如此看来,闭包函数相当于与外部变量绑在一起。
|  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"
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 ,返回一个闭包函数。 每次调用该闭包函数时,均返回下一个斐波那契数(从零开始)。
代码框架如下:
|  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())
    }
}
 | 
 
答案
|  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() (value int) {
        value = a
        a, b = b, a+b
        return
    }
}
func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}
 | 
 
【小菜学Go语言】系列文章首发于公众号【小菜学编程】,敬请关注:
