匿名函数是函数的一种,格式和普通函数一样,只是定义时没有函数名
普通函数的函数名是固定的,匿名函数的函数名称是系统随机的
匿名函数可以定义在函数外(全匿名函数),也可以定义在函数内(局部匿名函数),GO语言的普通函数不能嵌套定义,但是可以通过匿名函数来实现函数的嵌套定义
package main
import "fmt"
//全局匿名函数
//方式1
var a = func(){
fmt.Println("hellow world")
}
//方式2
var (
b = func(){
fmt.Println("hellow world")
}
)
func main(){
a()
b()
}
一般情况很少使用全局匿名函数,大多数情况都是使用局部匿名函数,匿名函数可以直接调用、保存到变量、作为参数或者返回值
package main
import "fmt"
func main(){
//例1 直接调用
func(s string){
fmt.Println(s)
}("hello lnj")
//例2 保存到变量
a := func(s string){
fmt.Println(s)
}
a("hello lnj")
//例3 作为参数
//调用函数,传递一个匿名函数
test1(func(s string){
fmt.Println(s)
})
//例4 作为返回值
res :=test2() //执行函数,返回一个匿名函数
res(10,20) //执行匿名函数
}
//定义一个函数 ,参数是一个匿名函数
func test1(f func(s string)){
f("hello lnj") //执行匿名函数
}
//定义一个函数 ,返回值是一个匿名函数
func test2() func(int,int){
return func(a int, b int){
fmt.Println(a+b)
}
}
匿名函数的使用
当某个函数只需要调用一次时,可以使用匿名函数
需要执行一些不确定操作时,可以使用匿名函数
package main
import "fmt"
func main(){
//项目经理
work(func(){
fmt.Println("组织部门开会")
})
//程序员
work(func(){
fmt.Println("码代码")
})
}
func work(custom func()){
//定义并执行匿名函数
func(){
fmt.Println("起床")
}() //这个括号是重点
//执行传入的匿名函数
custom()
//定义并使用一个局部匿名函数
latter := func(){
fmt.Println("睡觉")
}
latter()
}
闭包是一个特殊的匿名函数,他是匿名函数和相关引用环境组成的整体
可以理解为只要匿名函数中用到了外界的变量,那么这个匿名函数就是一个闭包
闭包中使用的变量和外界的变量是同一个变量,所以可以在闭包中修改外界变量
package main
import "fmt"
func main(){
//例1 定义匿名函数时用到了main函数的num,这个匿名函数就是一个闭包
num := 10
a := func(){
num++
fmt.Println(num)
}
a()
//例2 闭包中使用的变量和外界的变量是同一个,可以在闭包中修改外界变量
num1 :=1
b := func(){
num1 = 2
}
fmt.Println(num1) //1
b()
fmt.Println(num1) //2
//例3 只要闭包还在使用外界的变量,外界的变量就会一直存在,不被释放
res := addUpper() //执行addUpper函数返回匿名函数,这个匿名函数使用了外部的x所以被称为闭包
fmt.Ptintln(res()) //2 闭包使用后并没有被释放,所以x的值没有释放
fmt.Ptintln(res()) //3 闭包再次使用
fmt.Ptintln(res()) //4
}
func addUpper() func() int{
x:=1 //定义了一个局部变量
return func() int{ //返回一个匿名函数,匿名函数的返回值是一个整型
x++
return x
}
}