匿名函数 闭包匿名函数

​顾名思义,就是没有名字的函数。。。

func(){    fmt.Println("我就是匿名函数")}

匿名函数的两种执行方法

  1. 将匿名函数赋给一个变量
  2. 定义后立即执行匿名函数
// 讲匿名函数赋给一个变量tmp := func(){    fmt.Println("我是匿名函数")}tmp()// 定以后立即执行匿名函数(在函数定义之后加小括号,表示直接运行)func(){    fmt.Println("我是匿名函数")}()

闭包

​闭包是由函数和与其相关的引用环境组合而成的实体,个人认为就是把一个函数以及函数所用到的参数用另外一个函数包起来,保证函数多次运行的时候,所用到的值不会被初始化

func demo01() func(){    tmp := "这个变量无论多少次都不会被初始化"    tmp1 := 1    return func(){        tmp1++        fmt.Println(tmp,tmp1)    }}func main(){    test := demo01() // 此时test就是一个闭包    test() // 这个变量无论多少次都不会被初始化 2    test() // 这个变量无论多少次都不会被初始化 3    test() // 这个变量无论多少次都不会被初始化 4    test() // 这个变量无论多少次都不会被初始化 5}

​在上面的代码可以看到,定义了两个变量tmp和tmp1,这个被称之为自由变量,把匿名函数放在return返回的地方和自由变量构成的那个整体,就是闭包

优点

​个人认为,就是使用自由变量这种概念,延长了函数中某些变量的生命周期,避免这些变量随着函数的调用而反复的初始化

GPT是这么说的

闭包(Closure)是一种在Go语言中支持的函数特性,它允许函数访问并操作函数外部的变量。闭包有以下几个好处:

– 封装:闭包可以访问函数外部的变量,但外部无法访问闭包内部的变量。这样可以实现数据的封装和保护。
– 状态保持:闭包可以捕获并保存外部变量的状态,即使函数执行完毕,这些状态仍然存在。这样可以实现状态的保持和传递。
– 动态生成函数:闭包可以根据运行时的数据动态生成新的函数,提供更多的灵活性。

总之,闭包为Go语言提供了更多的编程灵活性和表达能力,可以帮助开发人员更好地解决复杂问题。