闭包的最佳实践和分析|学习笔记

简介: 快速学习闭包的最佳实践和分析

开发者学堂课程【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、结果输出:

image.png

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

}

image.png

(4)判断"winter"中有没有jpg,如果没有就加上,有则返回。效果一样,如果用闭包变量只要传一次,而函数每次都要传。因为函数是调用一次后缀不会保留,而闭包每次都会保留。

(5)闭包有一个最大好处就是把引用的变量保留下来,下次调用还可以用,而函数却不会保留,除非用全局变量,但闭包不用全局变量也可以实现。

相关文章
|
24天前
|
存储 缓存 JavaScript
闭包有什么应用场景呢
【10月更文挑战第12天】闭包有什么应用场景呢
|
28天前
|
存储 前端开发 JavaScript
前端必备知识:闭包的概念、作用与应用
前端必备知识:闭包的概念、作用与应用
16 1
|
4月前
|
Python
Python编程实战:利用闭包与装饰器优化日志记录功能
【7月更文挑战第7天】Python的闭包和装饰器简化了日志记录。通过定义如`log_decorator`的装饰器,可以在不修改原函数代码的情况下添加日志功能。当@log_decorator用于`add(x, y)`函数时,调用时自动记录日志。进一步,`timestamp_log_decorator`展示了如何创建特定功能的装饰器,如添加时间戳。这些技术减少了代码冗余,提高了代码的可维护性。
61 1
|
5月前
|
存储 JavaScript 前端开发
技术经验解读:什么是闭包?闭包的优缺点?
技术经验解读:什么是闭包?闭包的优缺点?
49 1
|
6月前
|
存储 JavaScript 前端开发
深度剖析JavaScript中的变量世界:概念、用例与避坑指南
【4月更文挑战第3天】探索JavaScript变量:了解var、let、const的差异,掌握数据类型、用例及避免错误的策略。声明变量时注意作用域和可变性,如var的函数作用域,let和const的块级作用域。理解基本数据类型(Number、String等)和对象类型。示例包括用户输入、计算、控制流程和函数参数。警惕未声明、作用域混淆、类型不匹配和未初始化的错误,遵循最佳实践,如明确命名、避免冗余和适时复用,利用类型检查工具提升代码质量。
105 1
|
6月前
|
自然语言处理 JavaScript 前端开发
JavaScript开发基础问题:如何理解闭包及其作用?
JavaScript开发基础问题:如何理解闭包及其作用?
58 5
|
前端开发
前端学习案例2-闭包的形式
前端学习案例2-闭包的形式
35 0
前端学习案例2-闭包的形式
|
前端开发
前端学习案例1-闭包定义
前端学习案例1-闭包定义
50 0
前端学习案例1-闭包定义
|
前端开发
前端学习案例4-闭包定义4
前端学习案例4-闭包定义4
68 0
前端学习案例4-闭包定义4
|
前端开发
前端学习案例2-闭包定义2
前端学习案例2-闭包定义2
61 0
前端学习案例2-闭包定义2