持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情
一、闭包
1.1 闭包介绍
闭包就是一个函数和与其相关的引用环境组合的一个整体(实体)
闭包:类
函数:操作
n: 字段
1.2 案例演示
package main
import "fmt"
// 累加器
// 返回的数据类型是 fun(int) int,是一个匿名函数
// 该匿名函数引用到了函数外的 n ,因此该匿名函数和n组成一个整体,构成闭包
// 函数和它使用到的n构成闭包
func AddUpper() func(int) int {
// 仅初始化一次
var n int = 10
return func(i int) int {
n += i
return n
}
}
func main() {
f := AddUpper()
// 反复调用f函数时,n仅初始化一次,因此每调用一次就进行一次累加
fmt.Println(f(1))
fmt.Println(f(2))
fmt.Println(f(3))
}
2.闭包最佳实践
- 编写一个函数makeffix(suffix string)可以接收一个文件后缀名(比如.jpg),并返回一个闭包
- 调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg) ,则返回文件名.jpg,如果已经有.jpg后缀,则返回原文件名。
- 要求使用闭包的方式完成
- strings.HasSuffix 判断是否有指定后缀
package main
import (
"fmt"
"strings"
)
func makeSuffix(suffix string) func(string) string {
return func(name string) string {
// 如果name 没有指定的后缀,就机上,否则,返回原来的名字
if strings.HasSuffix(name, suffix) == false {
return name + suffix
}
return name
}
}
func main() {
// 测试makeSuffix
// 先返回闭包
// 如果使用闭包仅传一次就可以
s := makeSuffix(".jpg")
fmt.Println("文件名处理后 = ", s("winter"))
fmt.Println("文件名处理后 = ", s("winter--2.jpg"))
}
案例说明
- 返回的函数和makeSuffx (suffix string)的suffx变量和返回的函数组合成一个闭包,因为返回的函数引用到suffix这个变量
- 闭包的好处,如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入后缀名,比如.jpg ,而闭包因为可以保留上次引用的某个值,所以我们传入一次就可以反复使用。
`