mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-11-13 09:16:10 +08:00
@@ -1,15 +1,15 @@
|
||||
# 6.9 应用闭包:将函数作为返回值
|
||||
|
||||
在程序 [function_return.go](examples/chapter_6/function_return.go) 中我们将会看到函数 Add2 和 Adder 均会返回签名为 `func(b int) int` 的函数:
|
||||
在程序 [function_return.go](examples/chapter_6/function_return.go) 中我们将会看到函数 `Add2()` 和 `Adder()` 均会返回签名为 `func(b int) int` 的函数:
|
||||
|
||||
```go
|
||||
func Add2() (func(b int) int)
|
||||
func Adder(a int) (func(b int) int)
|
||||
```
|
||||
|
||||
函数 Add2 不接受任何参数,但函数 Adder 接受一个 int 类型的整数作为参数。
|
||||
函数 `Add2()` 不接受任何参数,但函数 `Adder()` 接受一个 `int` 类型的整数作为参数。
|
||||
|
||||
我们也可以将 Adder 返回的函数存到变量中([function_return.go](examples/chapter_6/function_return.go))。
|
||||
我们也可以将 `Adder()` 返回的函数存到变量中 ([function_return.go](examples/chapter_6/function_return.go))。
|
||||
|
||||
```go
|
||||
package main
|
||||
@@ -45,7 +45,7 @@ Call Add2 for 3 gives: 5
|
||||
The result is: 5
|
||||
```
|
||||
|
||||
下例为一个略微不同的实现([function_closure.go](examples/chapter_6/function_closure.go)):
|
||||
下例为一个略微不同的实现 ([function_closure.go](examples/chapter_6/function_closure.go)):
|
||||
|
||||
```go
|
||||
package main
|
||||
@@ -68,15 +68,15 @@ func Adder() func(int) int {
|
||||
}
|
||||
```
|
||||
|
||||
函数 Adder() 现在被赋值到变量 f 中(类型为 `func(int) int`)。
|
||||
函数 `Adder()` 现在被赋值到变量 `f` 中(类型为 `func(int) int`)。
|
||||
|
||||
输出:
|
||||
|
||||
1 - 21 - 321
|
||||
|
||||
三次调用函数 f 的过程中函数 Adder() 中变量 delta 的值分别为:1、20 和 300。
|
||||
三次调用函数 `f` 的过程中函数 `Adder()` 中变量 `delta` 的值分别为:1、20 和 300。
|
||||
|
||||
我们可以看到,在多次调用中,变量 x 的值是被保留的,即 `0 + 1 = 1`,然后 `1 + 20 = 21`,最后 `21 + 300 = 321`:闭包函数保存并积累其中的变量的值,不管外部函数退出与否,它都能够继续操作外部函数中的局部变量。
|
||||
我们可以看到,在多次调用中,变量 `x` 的值是被保留的,即 `0 + 1 = 1`,然后 `1 + 20 = 21`,最后 `21 + 300 = 321`:闭包函数保存并积累其中的变量的值,不管外部函数退出与否,它都能够继续操作外部函数中的局部变量。
|
||||
|
||||
这些局部变量同样可以是参数,例如之前例子中的 `Adder(as int)`。
|
||||
|
||||
@@ -95,7 +95,9 @@ go func(i int) {
|
||||
|
||||
这样闭包函数就能够被应用到整个集合的元素上,并修改它们的值。然后这些变量就可以用于表示或计算全局或平均值。
|
||||
|
||||
**练习 6.9** 不使用递归但使用闭包改写第 6.6 节中的斐波那契数列程序。
|
||||
**练习 6.9** [fibonacci_closure](exercises\chapter_6\fibonacci_closure.go)
|
||||
|
||||
不使用递归但使用闭包改写第 6.6 节中的斐波那契数列程序。
|
||||
|
||||
**练习 6.10**
|
||||
|
||||
@@ -128,7 +130,7 @@ addBmp("file") // returns: file.bmp
|
||||
addJpeg("file") // returns: file.jpeg
|
||||
```
|
||||
|
||||
可以返回其它函数的函数和接受其它函数作为参数的函数均被称之为高阶函数,是函数式语言的特点。我们已经在第 6.7 中得知函数也是一种值,因此很显然 Go 语言具有一些函数式语言的特性。闭包在 Go 语言中非常常见,常用于 goroutine 和管道操作(详见第 14.8-14.9 节)。在第 11.14 节的程序中,我们将会看到 Go 语言中的函数在处理混合对象时的强大能力。
|
||||
可以返回其它函数的函数和接受其它函数作为参数的函数均被称之为高阶函数,是函数式语言的特点。我们已经在[第 6.7 节](06.7.md)中得知函数也是一种值,因此很显然 Go 语言具有一些函数式语言的特性。闭包在 Go 语言中非常常见,常用于 goroutine 和管道操作(详见第 [14.8](14.8.md)-[14.9](14.9.md) 节)。在[第 11.14 节](11.14.md)的程序中,我们将会看到 Go 语言中的函数在处理混合对象时的强大能力。
|
||||
|
||||
## 链接
|
||||
|
||||
|
||||
Reference in New Issue
Block a user