Golang閉包案例分析與普通函式對比

OldBoy~發表於2018-08-17

閉包案例

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字尾;用普通函式的話,傳遞完成字尾會消失,閉包會儲存。

相關文章