Golang 闭包

优质
小牛编辑
140浏览
2023-12-01

闭包是一个特殊的匿名函数,它是匿名函数和相关引用环境组成的一个整体

也就是说只要匿名函数中用到了外界的变量,那么这个匿名函数就是一个闭包

package main
import "fmt"
func main() {
    num := 10
    a := func() {
  	  num++ // 在闭包中用到了main函数中的num, 所以这个匿名函数就是一个闭包
  	  fmt.Println(num) // 11
    }
    a()
}

闭包中使用的变量和外界的变量是同一个变量,所以可以闭包中可以修改外界变量

package main
import "fmt"
func main() {
    num := 10
    a := func() {
  	  num = 6 // 在闭包中用到了main函数中的num, 所以这个匿名函数就是一个闭包
  	  fmt.Println(num) // 6
    }
    fmt.Println("执行闭包前", num) // 10
    a()
    fmt.Println("执行闭包后", num) // 6
}

只要闭包还在使用外界的变量,那么外界的变量就会一直存在

package main
import "fmt"
func main() {
  res := addUpper() // 执行addUpper函数,得到一个闭包
  fmt.Println(res()) // 2 
  fmt.Println(res()) // 3
  fmt.Println(res()) // 4
  fmt.Println(res()) // 5
}
func addUpper() func() int {
    x := 1
    return func() int {
  	  x++ // 匿名函数中用到了addUpper中的x,所以这是一个闭包
  	  return x
    }
}