函数值

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

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

/_src/tour/function-values.go

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "math"
  6. )
  7.  
  8.  
  9. func compute(fn func(float64, float64) float64) float64 {
  10. return fn(3, 4)
  11. }
  12.  
  13.  
  14. func main() {
  15. hypot := func(x, y float64) float64 {
  16. return math.Sqrt(x*x + y*y)
  17. }
  18. fmt.Println(hypot(5, 12))
  19.  
  20. fmt.Println(compute(hypot))
  21. fmt.Println(compute(math.Pow))
  22. }

闭包

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

/_src/tour/function-closures.go

  1. package main
  2.  
  3. import "fmt"
  4.  
  5.  
  6. func adder() func(int) int {
  7. sum := 0
  8. return func(x int) int {
  9. sum += x
  10. return sum
  11. }
  12. }
  13.  
  14.  
  15. func main() {
  16. pos, neg := adder(), adder()
  17. for i := 0; i < 10; i++ {
  18. fmt.Println(
  19. pos(i),
  20. neg(-2*i),
  21. )
  22. }
  23. }

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

练习

1. 斐波那契数列

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

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

代码框架如下:

/_src/tour/exercise-fibonacci-closure.go

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. // fabonacci is a function that returns
  6. // a function that returns an int.
  7. func fibonacci() func() int {
  8. }
  9.  
  10. func main() {
  11. f := fibonacci()
  12. for i := 0; i < 10; i++ {
  13. fmt.Println(f())
  14. }
  15. }

答案

/_src/tour/solution-fibonacci-closure.go

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. // fabonacci is a function that returns
  6. // a function that returns an int.
  7. func fibonacci() func() int {
  8. a, b := 0, 1
  9. return func() int {
  10. value := a
  11. a, b = b, a+b
  12. return value
  13. }
  14. }
  15.  
  16. func main() {
  17. f := fibonacci()
  18. for i := 0; i < 10; i++ {
  19. fmt.Println(f())
  20. }
  21. }

下一步

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

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

../_images/wechat-mp-qrcode.png小菜学编程

微信打赏