2022-4-20 实习Day18

1、新国结汇款业务问题文档整理。–2小时 100%
2、新国结测试 –3小时 100%

Golang编程学习(part 14)

1、闭包介绍

基本介绍: 闭包就是一个函数与其相关的引用环境组合的一个整体(实体)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import "fmt"

// 累加器
func AddUpper() func(int) int {
var n int = 10
return func(i int) int {
n = n + i
return n
}
}

func main() {
// 使用前面的代码
f := AddUpper()
fmt.Println(f(1))
fmt.Println(f(2))
fmt.Println(f(3))
}

// 11
// 13
// 16
对上面代码的说明和总结
① AddUpper是一个函数,返回的数据类型是 func (int) int
② 闭包的说明:返回的是一个匿名函数,但是这个匿名函数引用到函数外的n,因此这个匿名函数就和n形成一个整体,构成一个闭包
③ 大家可以这样理解:闭包是类,函数是操作,n是字段。函数和它使用到的n构成闭包
④ 当我们反复调用f函数时,因为n是初始化一次,因此每调用一次就进行一次累加
⑤ 我们要搞清楚闭包的关键,就是要分析出返回的函数它使用(引用)到哪些变量,因为函数和它引用到的变量共同构成闭包
⑥ 对上面代码的一个修改,加深对闭包的理解

2、闭包的最佳实践

请编写一个程序,具体要求如下

  1. 编写一个函数 makeSuffix(suffix string) 可以接收一个文件后缀名(比如.jpg),并返回一个闭包

  2. 调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg) ,则返回 文件名.jpg , 如

果已经有.jpg 后缀,则返回原文件名。

  1. 要求使用闭包的方式完成

  2. strings.HasSuffix , 该函数可以判断某个字符串是否有指定的后缀。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import (
"fmt"
"strings"
)

// 累加器
func makeSuffix(suffix string) func(string) string {
return func(name string) string {
if strings.HasSuffix(name, suffix) {
return name
} else {
return name + suffix
}
}
}

func main() {
m := makeSuffix(".jpg")
fmt.Println(m("hello"))
fmt.Println(m("win"))
}

代码建议:除非非常有价值的地方,不然不建议使用闭包。闭包这种数据和行为耦合的模型不是一种推荐的编程模型,仅仅是锦上添花,不是不可或缺
上面代码的总结和说明:
① 返回的匿名函数和makeSuffix(suffix string)的suffix变量组合成为一个闭包,因为返回的函数引用到suffix这个变量
② 我们体会一下闭包的好处,如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入后缀名,比如.jpg,而闭包因为可以保留上次引用的某个值,所以我们传入一次就可以反复使用。