闭包案例
package mainimport ( "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后缀;用普通函数的话,传递完成后缀会消失,闭包会保存。