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