函数值
在 Go 语言,函数也是一种值( C++ 函数对象、 Python 函数类似),可以被传递。
跟其他普通值一样,函数也可以作为 参数 传递或作为 返回值 返回。
- 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
- 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
- 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
- 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())
- }
- }
下一步
订阅更新,获取更多学习资料,请关注我们的 微信公众号 :