淺析Go語(yǔ)言中閉包的使用
閉包基本介紹
閉包就是 一個(gè)函數(shù) 和其相關(guān)的 引用環(huán)境 組合的一個(gè)整體
好處: 保存引用的變量,下次繼續(xù)使用,不會(huì)銷毀
下面通過(guò)閉包的方式,寫(xiě)一個(gè)數(shù)字累加器,體驗(yàn)一下閉包的妙處
閉包實(shí)現(xiàn)數(shù)字累加
package main
import "fmt"
// 累加器
// 閉包 - 函數(shù)柯里化
// 返回值類型: func(int) int
func AddUpper() func(int) int {
var n int = 100
return func(i int) int {
n = n + i
return n
}
}
func main() {
f := AddUpper()
fmt.Println(f(1)) // 101
fmt.Println(f(2)) // 103
fmt.Println(f(3)) // 106
}
代碼說(shuō)明
1.AddUpper是一個(gè)函數(shù),返回的數(shù)據(jù)類型 func(int) int
2.閉包的說(shuō)明

返回的是一個(gè)匿名函數(shù),但是這個(gè)匿名函數(shù)引用到了函數(shù)外的變量 n ,因此這個(gè)匿名函數(shù)就和 n 形成一個(gè)整體,構(gòu)成閉包
3.當(dāng)反復(fù)調(diào)用 f 函數(shù)時(shí),因?yàn)?n 只初始化一次,保存了變量的值,因此每調(diào)用一次就相當(dāng)于進(jìn)行了累加。
4.我們要搞清楚閉包,關(guān)鍵就是要分析返回的函數(shù)使用到哪些變量
代碼分析
這里我引入了一個(gè)字符串變量str,來(lái)幫助分析閉包是怎么保存變量的。
package main
import (
"fmt"
)
// 累加器
// 閉包 - 函數(shù)柯里化
// 返回值類型: func(int) int
func AddUpper() func(int) int {
var n int = 100
var str = "hello"
return func(i int) int {
n = n + i
fmt.Println("i=", i)
str += string(36) // ascii 36 = '$'
fmt.Printf("str==%s\n", str)
return n
}
}
func main() {
f := AddUpper()
// fmt.Println(AddUpper()(1)) // 101
fmt.Println("f(1)=", f(1)) // 101
fmt.Println("f(2)=", f(2)) // 103
fmt.Println("f(3)=", f(3)) // 106
}
i= 1
str==hello$
f(1)= 101
i= 2
str==hello$$
f(2)= 103
i= 3
str==hello$$$
f(3)= 106
從輸出可以看出來(lái),閉包引用的變量n和str并沒(méi)有在調(diào)用函數(shù)的時(shí)候重復(fù)聲明,而是保留了下次函數(shù)調(diào)用后更新的值。
閉包案例
需求:
- 編寫(xiě)一個(gè)函數(shù) makeSuffix(suffix string) ,可以接收一個(gè)文件后綴名,并返回一個(gè)閉包
- 調(diào)用閉包,可以傳入一個(gè)文件名,如果該文件名沒(méi)有指定后綴,則返回 文件名.jpg ,如果已經(jīng)有.jpg,則返回原文件名。
strings.HasSuffix,該函數(shù)可以判斷某個(gè)字符串是否有指定的后綴。
上代碼
package main
import (
"fmt"
"strings"
)
func makeSuffix(suffix string) func(string) string {
return func(name string) string {
if !strings.HasSuffix(name, suffix) {
return name + suffix
}
return name
}
}
// 傳統(tǒng)寫(xiě)法
func makeSuffixV2(suffix string, name string) string {
if !strings.HasSuffix(name, suffix) {
return name + suffix
}
return name
}
func main() {
// 閉包調(diào)用
f := makeSuffix(".jpg")
fmt.Println(f("xiao")) // xiao.jpg
fmt.Println(f("xiaoxiao.jpg")) // xiaoxiao.jpg
fmt.Println(f("xiaoxiao.666")) // xiaoxiao.666.jpg
// 傳統(tǒng)寫(xiě)法調(diào)用
fmt.Println("makeSuffixV2=", makeSuffixV2(".jpg", "allblue")) // makeSuffixV2= allblue.jpg
fmt.Println("makeSuffixV2=", makeSuffixV2(".jpg", "all.blue")) // makeSuffixV2= all.blue.jpg
}
代碼說(shuō)明
返回的匿名函數(shù)和 makeSuffix(suffix string) 的 suffix 變量組合成一個(gè)閉包
傳統(tǒng)寫(xiě)法和閉包寫(xiě)法實(shí)現(xiàn)效果一樣,但是,傳統(tǒng)寫(xiě)法需要重復(fù)寫(xiě)變量, 比如上面的
makeSuffixV2(".jpg", "all.blue"))
閉包則解決了這個(gè)問(wèn)題,是代碼看起來(lái)更加的簡(jiǎn)潔
閉包的好處之一: 參數(shù)復(fù)用
好處: 保存引用的變量,下次繼續(xù)使用,不會(huì)銷毀
到此這篇關(guān)于淺析Go語(yǔ)言中閉包的使用的文章就介紹到這了,更多相關(guān)Go語(yǔ)言閉包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang設(shè)計(jì)模式之原型模式詳細(xì)講解
如果一個(gè)類的有非常多的屬性,層級(jí)還很深。每次構(gòu)造起來(lái),不管是直接構(gòu)造還是用建造者模式,都要對(duì)太多屬性進(jìn)行復(fù)制,那么有沒(méi)有一種好的方式讓我們創(chuàng)建太的時(shí)候使用體驗(yàn)更好一點(diǎn)呢? 今天的文章里就給大家介紹一種設(shè)計(jì)模式,來(lái)解決這個(gè)問(wèn)題2023-01-01

