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

posted @ 2018-08-17 20:16  温柔的风  阅读(466)  评论(0编辑  收藏  举报