go语言笔记(五)闭包
闭包
案例分析
闭包就是一个函数与其相关的引用环境组合的一个实体
package main
import (
"fmt"
)
//累加器
func AddUpper() func(int) int {
var n int = 10
return func(x int) int {
n = n + x
return n
}
}
func main() {
f := AddUpper()
fmt.Println(f(1))
fmt.Println(f(2))
}
/*
11
13
*/
以上代码中,运行第一次f(1)时,AddUpper中n变为了11,再次运行f(2),结果就是11+2=13。
原因:
1.AddUpper返回的数据类型是func(int) int类型的函数
2.以上代码中哪一个区域称之为闭包:
var n int = 10
return func(x int) int {
n = n + x
return n
返回的是一个匿名函数,该匿名函数引用了外部的变量n,二者作为一个整体构成了闭包
3.理解:闭包是类,函数是操作,n是字段
4.当我们反复调用f函数时,n只初始化一次,所以每调用一次就进行一次累加,不会重新初始化
5.闭包的关键在于返回的函数引用到了哪些变量
实践
请编写一个程序。具体要求如下:
1.编写一个函数makeSuffix(suffix string),可以接受文件后缀名(如.jpg),并返回一个闭包
2.调用闭包,可以传入一个文件名,如果该文件名没有指定后缀".jpg",则返回"文件名.jpg",如果有
".jpg"后缀,则返回原文件名
3.要求使用闭包的方式完成
package main
import (
"fmt"
"strings"
)
func makeSuffix(suffix string) func(string) string {
return func(name string) string {
p := strings.Split(name, ".")
if len(p) == 1 {
name = name + "." + suffix
return name
}else if len(p) == 2 {
if p[1] == suffix {
return name
}else {
p[1] = suffix
name = p[0] + "." + p[1]
return name
}
}
return "error"
}
}
func main() {
f := makeSuffix("jpg")
fmt.Println(f("abc"))
fmt.Println(f("xyz.png"))
fmt.Println(f("gagaga.jpg"))
}
从上面的例子可以看出,闭包的好处在于不用每次调用函数都输入“.jpg”这个参数。因为它已经包含在闭包中的外部变量suffix中了。如果使用普通函数来完成上面的功能,必须每次都输入suffix和name两个变量。