go语言闭包
一、基本介绍
闭包就是一个函数和于其相关的引用环境组合的一个整体
二、案例演示
累计器
package main
import (
"fmt"
)
func AddUpper() func(int) int {
n := 10
return func(x int) int {
n = n + x
return n
}
}
func main() {
f := AddUpper()
fmt.Printf("res=%d\n", f(1))
fmt.Printf("res=%d\n", f(2))
fmt.Printf("res=%d\n", f(3))
}
输出结果:
res=11
res=13
res=16
说明:
- AddUpper是函数,返回的数据类型是func(int) int
- AddUpper返回的是一个匿名函数,但是这个匿名函数引用函数外的n,因此这个匿名函数就和n形成一个整体,构成闭包。
- 大家可以这样理解:闭包是类,函数时操作,n是字段。函数和它使用的n构成闭包
- 当我们反复的调用f时,因为n时初始化一次,因此每调用一次就进行累加,不会重新初始化
- 我们高清楚闭包的关键,就是要分析出返回的函数和它引用了哪些变量,因为返回的函数和它引用到的变量共同构成闭包
三、闭包的应用
需求:编写一个函数可以接收一个文件后缀名,当传入一个文件名时,如果该文件名没有指定后缀,则将接收的文件后缀名加在文件名后返回,如果指定了后缀名,则返回原文件名
import (
"fmt"
"strings"
)
func makeSuffix(suffix string) func(string) string {
return func(fileName string) string {
result := fileName
if !strings.HasSuffix(fileName, suffix) {
result = fileName + suffix
}
return result
}
}
func main() {
f := makeSuffix(".jpg")
fmt.Println(f("aa.jpg"))
fmt.Println(f("bb.jpg"))
}
输出结果:
aa.jpg
bb.jpg
代码说明:
- makeSuffix返回的是一个函数,返回的函数和makeSuffix(suffix string)的suffix变量组成了一个闭包,因为返回的函数引用到suffix这个变量。
2.我们体会一下闭包的好处,如果使用传统方法,也可以轻松实现这个功能,但是传统方法需要每次都传入后缀名,而闭包可以保留上次引用的某个值,所以我们传入一次就可以重复使用。