匿名函数是指不需要定义函数名的函数实现方法。 这不是一个新概念。 它可以追溯到1985年的Lisp语言。然而,由于种种原因,C和C++一直不支持匿名函数。 其他各种语言,比如JavaScript、C#和Objective-C匿名函数 javascript,都提供了匿名函数特性,当然也包括go语言。
1. 匿名函数
在Go上,函数可以像普通变量一样传递或使用,这类似于C语言的bounce函数。 不同的是Go语言支持随时在代码中定义匿名函数。
匿名函数由不带函数名的函数声明和函数体组成,如下所示:
func(a,b int,z float64) bool {
return a*b < int(z)
}
匿名函数可以直接参数化为变量或直接执行:
f := func(x, y int) int {
return x + y
}
2. 关闭
Go 的匿名函数是一个闭包。 我们先来了解一下一些闭包的概念、价值以及应用场景。
基本概念
闭包是一个代码块,可以包含自由变量(未绑定到特定对象),这些变量不是在该块或任何全局上下文中定义的,而是在定义该块的环境中定义的。 要执行的代码块(由于自由变量位于代码块内,并且它们引用的对象不会被释放)为要绑定的自由变量提供评估环境(范围)。
闭包的价值
闭包的价值在于它们可以用作函数对象或匿名函数。 对于类型系统,这意味着除了数据之外还表示代码。 大多数支持闭包的语言都使用函数作为第一级对象,这意味着此类函数可以存储在变量中并作为参数传递给其他函数。 最重要的是它们是否可以由函数动态创建和返回。 ,
Go语言中的闭包
Go语言中的闭包也指的是函数外部的变量。 闭包的实现确保只要使用闭包匿名函数 javascript,闭包引用的变量就会持续存在。
package main
import(
“fmt”
)
func main(){
var j int = 5
a := func()(func()) {
var i int = 10
return func() {
fmt.Printf("i, j: %d, %dn", i, j)
}
}()
a()
j*=2
a()
}
上面例子的执行结果是:
i,j:10,5
i,j:10,10
在前面的例子中,变量a指向的闭包函数引用了局部变量i和j,i的值是隔离的,闭包之外的环境无法改变。 改变j的值后,再次调用a,发现结果是改变后的值。
在变量a指向的闭包函数中,只有内部匿名函数可以访问变量i,而无法通过其他方式访问它,从而保证了i的安全性。