开发者学堂课程【Go语言核心编程 - 基础语法、数组、切片、Map:闭包的最佳实践和分析】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/625/detail/9608
闭包的最佳实践和分析
内容介绍:
一、编写程序的要求
二、解题思路
一、编写一个程序,具体要求如下
1、编写一个函数 makeSuffix(suffix string)可以接收一个文件后缀名(比如.jpg),并返回一个闭包。
2、调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.ipg) ,则返回文件名.jpg,如果已经有.jpg后缀,则返回原文件名。
3、要求使用闭包的方式完成。
4、strings.HasSuffix,该函数可以判断某个字符串是否有指定的后缀。
二、解题思路:
打开 vs code,首先写一个函数 func makesuffix,传入一个参数 suffix string,返回一个闭包。如果该文件名没有指定的后缀(比如.ipg) ,则返回文件名;如果已经有.jpg后缀,则返回原文件名。接收一个 string 返回一个 string。return 闭包变量为name 如果 name 没有指定后缀,则加上,否则就返回原来的名字。strings.HasSuffix (name,suffix)=false,就返回 name。测试 makesuffix 的使用,先返回一个闭包用f接收,指定后缀jpg。f2 := makesuffix(".jpg"),需要引入 string的包,注意变量的单词不能写错,结果应该是返回 winter.jpg。如果本身是biud.jpg,返回就是原来的。如果后缀是 avi,则返回 biud.avi.jpg。
1、代码:
func makesuffix(suffix string) func (string) string {
return func (name string) string {
//如果 name没有指定后缀,则加上,否则就返回原来的名字if !strings.HasSuffix(name,suffix){
return name + suffix
return name
}
}
func main() i
//使用前面的代码
f := Addupper()
fmt.Println(f(1))// 11
fmt.Println(f(2))// 13
fmt.Println(f(3))// 16
//测试makesuffix的使用
//返回一个闭包
f2 := makesuffix(".jpg")
fmt.Println("文件名处理后=",f2("winter")) // winter.jpg
fmt.Println("文件名处理后=",f2("bird.jpg"))/ / bird.jpg
}
2、结果输出:
3、上面代码的总结和说明:
(1)返回的匿名函数和 makeSufix (suffix string)的 suffix 变量组合成一个闭包,因为返回的函数引用到 suffix 这个变量就是
func (name string) string {
//如果 name没有指定后缀,则加上,否则就返回原来的名字if !strings.HasSuffix(name,suffix){
return name + suffix
return name
}这一段代码和变量suffix构成一个闭包
(2)闭包的好处,如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入后缀名,比如jpg ,而闭包因为可以保留上次引用的某个值,所以我们传入一次就可以反复使用。而函数调用一次不用全局变量则会被销毁。
(3)如果不用闭包,写一个函数判断有没有后缀,如果有后缀按原来的返回,不用闭包完成。
不用闭包的代码
func makesuffix2(suffix string,name string) string {
//如果 name没有指定后缀,则加上,否则就返回原来的名字if !strings.HasSuffix(name,suffix){
return name + suffix
}
return name
}
func main(){
fmt.Println("文件名处理后=",makesuffix2("jpg
”
,"winter")) //winter.jgp
fmt.Println("文件名处理后=", makesuffix2("jpg
”
,bird.jpg")) //bird.jpg
}
(4)判断"winter"中有没有jpg,如果没有就加上,有则返回。效果一样,如果用闭包变量只要传一次,而函数每次都要传。因为函数是调用一次后缀不会保留,而闭包每次都会保留。
(5)闭包有一个最大好处就是把引用的变量保留下来,下次调用还可以用,而函数却不会保留,除非用全局变量,但闭包不用全局变量也可以实现。