Golang 闭包
优质
小牛编辑
147浏览
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 } }