0%

闭包函数

闭包函数定义

Go 语言支持匿名函数,可作为闭包。匿名函数是一个”内联”语句或表达式。匿名函数的优越性在于可以直接使用函数内的变量,不必申明

闭包函数示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main

import "fmt"

func getSequence() func() int {
i := 0
return func() int {
i += 1
return i
}
}

func main() {
/* nextNumber 为一个函数,函数 i 为 0 */
nextNumber := getSequence()

/* 调用 nextNumber 函数,i 变量自增 1 并返回 */
fmt.Println(nextNumber())
fmt.Println(nextNumber())
fmt.Println(nextNumber())

/* 创建新的函数 nextNumber1,并查看结果 */
nextNumber1 := getSequence()
fmt.Println(nextNumber1())
fmt.Println(nextNumber1())
}

闭包总结

  1. 闭包是一个可以访问另一个函数内部变量的函数
  2. 一般的函数在使用完后,内部的变量会被回收,而闭包不会,变量依旧存在于内存中,不会消失。
  3. 频繁的使用闭包会占用内存,降低CPU性能,但是可以释放内存(在使用完闭包后,手动使变量为null)

应用场景

  1. 内部函数变量、方法访问外部的变量、函数,延长作用域链
  2. 即时函数
  3. 模仿块级作用域,在函数执行完时,函数内部所有的变量都会被立即销毁。

匿名函数和闭包函数的区别

  • 匿名函数:没有函数名称的函数;
  • 闭包函数:一个可以使用另外一个函数作用域中的变量的函数。