Go语言学习之旅14——匿名函数和闭包

在go语言当中,匿名函数可以作为一个函数当中的变量,它没有函数名称但是却可以访问其作用域外的变量,这样的能力被称为闭包

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
func main() {

// 01、匿名函数的声明和调用
a := func() {
fmt.Println("hello world")
}
a()

// 02、直接调用匿名函数
func() {
fmt.Println("你好")
}() // ()代表调用函数和传参

// 03、下面演示闭包,匿名函数可以访问函数外的变量
num1 := 10
str1 := "abc"

func() {
fmt.Printf("num1 = %d, str1 = %s\n", num1, str1)
}()

// 04、闭包的参数传递特性测试,由于num1被改变了,所以闭包是传递的引用
func() {
num1 = num1 + 1
fmt.Printf("num1现在等于%d\n", num1)
}()
fmt.Printf("num1现在等于%d\n", num1)
}

闭包内变量的生命周期与普通函数不同,普通函数的变量在被调用时初始化,调用结束后即被回收,而闭包内的变量的生命周期和作用域无关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 闭包内变量的生命周期不受其作用域限制
func test() func() int {
x := 0
return func() int {
x++
return x
}
}

func main() {
t := test()
fmt.Println(t())
fmt.Println(t())
fmt.Println(t())
fmt.Println(t())
fmt.Println(t())
}

以上输出结果分别为:1、2、3、4、5