Go语言闭包

Go语言闭包教程

闭包 就是一个 函数 和与其相关的引用环境组合的一个整体。

Go语言闭包

Go 语言 中闭包是引用了 自由变量 的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量。

闭包(Closure)在某些编程语言中也被称为 Lambda 表达式。

闭包的记忆功能

在 Go 语言中,被捕获到闭包中的变量让闭包本身拥有了记忆效应,闭包中的逻辑可以修改闭包捕获的变量,变量会跟随闭包生命期一直存在,闭包本身就如同变量一样拥有了记忆功能。

案例

Go语言闭包记忆效应

Go 语言闭包记忆效应,实现累加

package main import ( "fmt" ) func AddUpper() func(int)int{ var n int = 20 return func(x int) int { n = n + x return n } } func main() { fmt.Println("嗨客网(www.haicoder.net)") //Go语言闭包记忆效应,实现累加 f := AddUpper() fmt.Println("闭包返回:",f(1)) fmt.Println("闭包返回:",f(2)) fmt.Println("闭包返回:",f(3)) }

程序运行后,控制台输出如下:

23_golang闭包.png

我们定义了一个 AddUpper 函数,该函数返回的 数据类型 是 func(int)int,即是一个匿名函数,该匿名函数引用到函数外的 n,因此这个匿名函数就和 n 形成了一个整体,构成了闭包。

我们反复调用 f 函数时,因为 n 只初始化一次,因此每调用一次就累计一次。

Go语言闭包

Go 语言闭包,实现判断文件后缀

package main import ( "fmt" "strings" ) func makeSuffix(suffix string)func(string)string{ return func(name string)string{ if !strings.HasSuffix(name, suffix){ return name + suffix } return name } } func main() { fmt.Println("Hello 嗨客网(www.haicoder.net)") //Go语言闭包,实现判断文件后缀 f := makeSuffix(".jpg") fmt.Println("FileName =", f("sea")) fmt.Println("FileName =", f("sun.jpg")) }

程序运行后,控制台输出如下:

24_golang闭包.png

我们定义了一个 makeSuffix 函数,该函数传入一个 string 类型的参数,返回一个参数是 string 类型返回值也是 string 类型的匿名函数。

返回的匿名函数和 suffix 变量组成了一个闭包,因为返回的额函数引用到了 suffix 变量。

Go语言闭包总结

闭包就是一个函数和与其相关的引用环境组合的一个整体。

在 Go 语言中,被捕获到闭包中的变量让闭包本身拥有了记忆效应,闭包中的逻辑可以修改闭包捕获的变量,变量会跟随闭包生命期一直存在,闭包本身就如同变量一样拥有了记忆功能。