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语言】系列文章首发于公众号【小菜学编程】,敬请关注: