golang 闭包

golang 闭包

匿名函数定义

未指定函数名的函数被称为匿名函数。

Golang 匿名函数的三种声明方法

1. 在定义时调用匿名函数 这种方式是将匿名函数直接定义在语句中,并立即调用。语法格式如下:

1
2
3
4
5
6
7
func main() {
  // 在定义时调用匿名函数
  res := func(n1 int, n2 int) int {
    return n1 + n2
  }(10, 20)
  fmt.Println(res) // 30
}

2. 将匿名函数赋值给变量 这种方式是将匿名函数赋值给一个变量,然后通过变量来调用匿名函数。语法格式如下:

1
2
3
4
5
6
7
8
func main() {
  // 将匿名函数赋值给变量
  add := func(n1 int, n2 int) int {
    return n1 + n2
  }
  res := add(10, 20)
  fmt.Println(res) // 30
}

3. 将匿名函数作为参数传递 这种方式是将匿名函数作为参数传递给另一个函数。语法格式如下:

1
2
3
4
5
6
7
8
func main() {
  // 将匿名函数赋值给变量
  add := func(n1 int, n2 int) int {
    return n1 + n2
  }
  res := add(10, 20)
  fmt.Println(res) // 30
}

使用匿名函数创建闭包

闭包定义

闭包是由函数和与其相关的引用环境组合而成的实体

  1. 闭包对外函数的变量的修改,是对变量的引用
  2. 变量被引用后,它所在的函数结束,这变量也不会马上被销毁
    • 闭包函数保存并积累其中的变量的值,不管外部函数退出与否,它都能够继续操作外部函数中的局部变量。
  3. 在闭包中使用到的变量可以是在闭包函数体内声明的,也可以是在外部函数声明的。
  4. 一个返回值为另一个函数的函数可以被称之为工厂函数,这在需要创建一系列相似的函数的时候非常有用:书写一个工厂函数而不是针对每种情况都书写一个函数。
  5. 闭包会发生变量逃逸,原因如 2

如何构造闭包

  1. 被嵌套的函数引用到非本函数的外部变量,而且这外部变量不是 全局变量
  2. 嵌套的函数被独立了出来(被父函数返回或赋值,变成了独立的个体),而被引用的变量所在的父函数已结束。

这段golang闭包代码运行结果是什么 为什么是这个结果

1
2
3
4
5
6
7
8
9
var dummy [3]int
var f func()
for i := 0; i < len(dummy); {
	f = func() {
		println(i)
	}
	i++
}
f()

References

Licensed under CC BY-NC-SA 4.0