August 2021
Beginner to intermediate
450 pages
6h 1m
Chinese
命名函数只能在包级别的作用域进行声明,但我们能够使用函数字面量在任何表达式内指定函数变量。函数字面量就像函数声明,但在func关键字后面没有函数的名称。它是一个表达式,它的值称作匿名函数。
函数字面量在我们需要使用的时候才定义。就像下面这个例子,之前的函数调用strings.Map可以写成:
更重要的是,以这种方式定义的函数能够获取到整个词法环境,因此里层的函数可以使用外层函数中的变量,如下面这个示例所示:
函数squares返回了另一个函数,类型是func()int。调用squares创建了一个局部变量x而且返回了一个匿名函数,每次调用squares都会递增x的值然后返回x的平方。第二次调用squares函数将创建第二个变量x,然后返回一个递增x值的新匿名函数。
这个求平方的示例演示了函数变量不仅是一段代码还可以拥有状态。里层的匿名函数能够获取和更新外层squares函数的局部变量。这些隐藏的变量引用就是我们把函数归类为引用类型而且函数变量无法进行比较的原因。函数变量类似于使用闭包方法实现的变量,Go程序员通常把函数变量称为闭包。 ...