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

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

开发者学堂课程【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)闭包有一个最大好处就是把引用的变量保留下来,下次调用还可以用,而函数却不会保留,除非用全局变量,但闭包不用全局变量也可以实现。

相关文章
|
JavaScript 前端开发
TypeScript 中的 infer 关键字
TypeScript 中的 infer 关键字
416 0
|
Cloud Native 关系型数据库 分布式数据库
阿里云牵手海亮科技,共建“教育科技数据库创新应用中心”
海亮科技选择引入阿里云PolarDB开源分布式版(PolarDB for Xscale)数据库,不仅能解决海亮科技数据库业务中面临的可靠性、稳定性问题,也为海亮科技业务的高速发展提供了更好的灵活性和可扩展性。
|
11月前
|
机器学习/深度学习 数据采集 自然语言处理
Pandas数据应用:情感分析
本文介绍了如何使用Pandas进行情感分析,涵盖数据准备、清洗、特征工程和模型构建。通过读取CSV文件、处理缺失值与重复项、转换文本格式,利用TF-IDF提取特征,并采用SVM等算法训练分类器。还讨论了内存不足、过拟合等问题的解决方案。旨在帮助读者掌握情感分析的基本流程与技巧。
292 35
|
网络虚拟化
工作多年,有多少人还不知道MUX VLAN的?
工作多年,有多少人还不知道MUX VLAN的?
344 0
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
306 4
|
Rust 安全 JavaScript
Rust 和 WebAssembly 搞大事啦!代码在浏览器中运行,这波操作简直逆天!
【8月更文挑战第31天】《Rust 与 WebAssembly:将 Rust 代码运行在浏览器中》介绍了 Rust 和 WebAssembly 的强大结合。Rust 是一门安全高效的编程语言,而 WebAssembly 则是新兴的网页技术标准,两者结合使得 Rust 代码能在浏览器中运行,带来更高的性能和安全性。文章通过示例代码展示了如何将 Rust 函数编译为 WebAssembly 格式并在网页中调用,从而实现复杂高效的应用程序,同时确保了内存安全性和跨平台兼容性,为开发者提供了全新的可能性。
549 0
|
存储 JSON 关系型数据库
带你走进PostgreSQL的世界
带你走进PostgreSQL的世界
784 0
|
开发工具 Ubuntu Linux
vim中函数跳转的功能实现
该文介绍了如何在Vim中实现函数跳转功能,通过安装`ctags`插件来完成。在CentOS/OpenEuler使用`sudo yum install ctags`,Ubuntu系统用`sudo apt-get install ctags`安装ctags,然后在源代码目录下运行`ctags -R .`生成tags文件。在Vim中,使用`Ctrl + ]`跳转到定义处,`Ctrl + t`返回原位置。文章还提到跨文件跳转及`tags`文件的更新与配置Vim的相关信息。
391 2
如何使用mitmproxy 修改http code
如何使用mitmproxy 修改http code
|
数据采集 网络安全 数据中心
静态IP代理和动态IP代理的区别是什么?
在网络通信中,IP地址标识设备位置。静态IP代理提供固定的IP地址,确保稳定性与匿名性,适用于企业网络,而动态IP代理使用可变IP,提供灵活性,常用于爬虫和数据采集。静态IP代理稳定但易被识别封锁,动态IP代理灵活但可能暴露用户IP。两者主要区别在于IP地址是否固定。