<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
閉包就是 一個函數 和其相關的 參照環境 組合的一個整體
好處: 儲存參照的變數,下次繼續使用,不會銷燬
下面通過閉包的方式,寫一個數位累加器,體驗一下閉包的妙處
package main import "fmt" // 累加器 // 閉包 - 函數柯里化 // 返回值型別: 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 }
1.AddUpper是一個函數,返回的資料型別 func(int) int
2.閉包的說明
返回的是一個匿名函數,但是這個匿名函數參照到了函數外的變數 n ,因此這個匿名函數就和 n 形成一個整體,構成閉包
3.當反覆呼叫 f
函數時,因為 n 只初始化一次,儲存了變數的值,因此每呼叫一次就相當於進行了累加。
4.我們要搞清楚閉包,關鍵就是要分析返回的函數使用到哪些變數
這裡我引入了一個字串變數str
,來幫助分析閉包是怎麼儲存變數的。
package main import ( "fmt" ) // 累加器 // 閉包 - 函數柯里化 // 返回值型別: 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==%sn", 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
從輸出可以看出來,閉包參照的變數n
和str
並沒有在呼叫函數的時候重複宣告,而是保留了下次函數呼叫後更新的值。
需求:
strings.HasSuffix,該函數可以判斷某個字串是否有指定的字尾。
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 } } // 傳統寫法 func makeSuffixV2(suffix string, name string) string { if !strings.HasSuffix(name, suffix) { return name + suffix } return name } func main() { // 閉包呼叫 f := makeSuffix(".jpg") fmt.Println(f("xiao")) // xiao.jpg fmt.Println(f("xiaoxiao.jpg")) // xiaoxiao.jpg fmt.Println(f("xiaoxiao.666")) // xiaoxiao.666.jpg // 傳統寫法呼叫 fmt.Println("makeSuffixV2=", makeSuffixV2(".jpg", "allblue")) // makeSuffixV2= allblue.jpg fmt.Println("makeSuffixV2=", makeSuffixV2(".jpg", "all.blue")) // makeSuffixV2= all.blue.jpg }
返回的匿名函數和 makeSuffix(suffix string) 的 suffix 變數組合成一個閉包
傳統寫法和閉包寫法實現效果一樣,但是,傳統寫法需要重複寫變數, 比如上面的
makeSuffixV2(".jpg", "all.blue"))
閉包則解決了這個問題,是程式碼看起來更加的簡潔
閉包的好處之一: 引數複用
好處: 儲存參照的變數,下次繼續使用,不會銷燬
到此這篇關於淺析Go語言中閉包的使用的文章就介紹到這了,更多相關Go語言閉包內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45