Golang闭包案例分析与普通函数对比

闭包案例

package main
import (
"fmt"
"strings" //记住一定引入strings包
) //①编写一个函数makeSuffix,可以接收一个文件后缀名(比如.jpg),并返回一个闭包
//②调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(如.jpg),则返回.jpg,如果有则全称
//③要求使用闭包方式
//④strings.HasSuffix该函数可以来判断某个字符串是否有指定后缀 func makeSuffix (suffix string) func (string) string {
return func (name string) string {
if !strings.HasSuffix(name, suffix) {
return name + suffix //如果没有后缀就拼接
}
return name
}
}
func main(){ //先返回一个闭包
test := makeSuffix(".jpg") fmt.Println("文件名处理后:", test("go语言圣经"))
fmt.Println("文件名处理后:", test("PHP设计模式.jpg")) }
D:\goproject\src\main>go run hello.go
文件名处理后: go语言圣经.jpg
文件名处理后: PHP设计模式.jpg

 说明

以上代码返回的是一个函数,这个函数引用的是suffix,而suffix是函数外的变量,那么这个函数外的suffix和返回的函数构成闭包。

普通函数

//传递根据哪个后缀判断,其次是文件名字
func makeSuffix (suffix string, name string) string { if !strings.HasSuffix(name, suffix) {
return name + suffix //如果没有后缀就拼接
}
return name }
func main(){ fmt.Println("文件名处理后:", makeSuffix("jpg","go语言圣经"))
fmt.Println("文件名处理后:", makeSuffix("jpg","PHP设计模式.jpg")) }
D:\goproject\src\main>go run hello.go
文件名处理后: go语言圣经jpg
文件名处理后: PHP设计模式.jpg

对比说明

闭包函数只需要传递一次要测试的jpg后缀;用普通函数的话,传递完成后缀会消失,闭包会保存。

上一篇:Luogu 2827 [NOIP2016] 蚯蚓


下一篇:[OC Foundation框架 - 15] NSDate