清華尹成帶你實戰GO案例(18)Go 閉包函式
Go 閉包函式
Go支援匿名函式,匿名函式可以形成閉包。閉包函式可以訪問定義閉包的函式定義的內部變數。
示例1:
輸出結果為
1
2
3
1
示例2:
輸出結果為:
15
16
25
示例3:
輸出結果:
0x401200 = 3
0x401200 = 3
0x401200 = 3
示例4:
輸出結果為:
0
1
3
6
10
15
21
28
36
Go支援匿名函式,匿名函式可以形成閉包。閉包函式可以訪問定義閉包的函式定義的內部變數。
示例1:
package main
import "fmt"
// 這個"intSeq"函式返回另外一個在intSeq內部定義的匿名函式,
// 這個返回的匿名函式包住了變數i,從而形成了一個閉包
func intSeq() func() int {
i := 0
return func() int {
i += 1
return i
}
}
func main() {
// 我們呼叫intSeq函式,並且把結果賦值給一個函式nextInt,
// 這個nextInt函式擁有自己的i變數,這個變數每次呼叫都被更新。
// 這裡i的初始值是由intSeq呼叫的時候決定的。
nextInt := intSeq()
// 呼叫幾次nextInt,看看閉包的效果
fmt.Println(nextInt())
fmt.Println(nextInt())
fmt.Println(nextInt())
// 為了確認閉包的狀態是獨立於intSeq函式的,再建立一個。
newInts := intSeq()
fmt.Println(newInts())
}
輸出結果為
1
2
3
1
示例2:
package main
import "fmt"
func main() {
add10 := closure(10)//其實是構造了一個加10函式
fmt.Println(add10(5))
fmt.Println(add10(6))
add20 := closure(20)
fmt.Println(add20(5))
}
func closure(x int) func(y int) int {
return func(y int) int {
return x + y
}
}
輸出結果為:
15
16
25
示例3:
package main
import "fmt"
func main() {
var fs []func() int
for i := 0; i < 3; i++ {
fs = append(fs, func() int {
return i
})
}
for _, f := range fs {
fmt.Printf("%p = %v\n", f, f())
}
}
輸出結果:
0x401200 = 3
0x401200 = 3
0x401200 = 3
示例4:
package main
import "fmt"
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
func main() {
result := adder()
for i := 0; i < 10; i++ {
fmt.Println(result(i))
}
}
輸出結果為:
0
1
3
6
10
15
21
28
36
45
網址:http://www.qukuailianxueyuan.io/
欲領取造幣技術與全套虛擬機器資料
區塊鏈技術交流QQ群:756146052 備註:CSDN
尹成學院微信:備註:CSDN
網址:http://www.qukuailianxueyuan.io/
欲領取造幣技術與全套虛擬機器資料
區塊鏈技術交流QQ群:756146052 備註:CSDN
尹成學院微信:備註:CSDN
相關文章
- 清華尹成帶你實戰GO案例(13)Go range函式Go函式
- 清華尹成帶你實戰GO案例(26)Go 遞迴函式Go遞迴函式
- 清華尹成帶你實戰GO案例(31)Go 函式定義Go函式
- 清華尹成帶你實戰GO案例(33)Go 函式回撥Go函式
- 清華尹成帶你實戰GO案例(3)Go 字串操作函式Go字串函式
- 清華尹成帶你實戰GO案例(30)Go 關閉通道Go
- 清華尹成帶你實戰GO案例(22)Go常量Go
- 清華尹成帶你實戰GO案例(28)Go 方法Go
- 清華尹成帶你實戰GO案例(35)Go 互斥Go
- 清華尹成帶你實戰GO案例(38)Go 介面Go
- 清華尹成帶你實戰GO案例(46)Go 排序Go排序
- 清華尹成帶你實戰GO案例(47)Go 切片Go
- 清華尹成帶你實戰GO案例(2) Go 字典Go
- 清華尹成帶你實戰GO案例(7)Go DeferGo
- 清華尹成帶你實戰GO案例(7)Go ExitGo
- 清華尹成帶你實戰GO案例(12)Go PanicGo
- 清華尹成帶你實戰GO案例(32)Go 函式多返回值Go函式
- 清華尹成帶你實戰GO案例(34)Go 函式命名返回值Go函式
- 清華尹成帶你實戰GO案例(63)Go 正規表示式Go
- 清華尹成帶你實戰GO案例(19)Go變數Go變數
- 清華尹成帶你實戰GO案例(23)Go 超時Go
- 清華尹成帶你實戰GO案例(29)Go 工作池Go
- 清華尹成帶你實戰GO案例(37)Go 集合功能Go
- 清華尹成帶你實戰GO案例(49)Go 時間Go
- 清華尹成帶你實戰GO案例(52)Go數值Go
- 清華尹成帶你實戰GO案例(54)Go 陣列Go陣列
- 清華尹成帶你實戰GO案例(57)Go通道方向Go
- 清華尹成帶你實戰GO案例(63)Go 指標Go指標
- 清華尹成帶你實戰GO案例(8)Go for迴圈Go
- 清華尹成帶你實戰GO案例(17) Go URL解析Go
- 清華尹成帶你實戰GO案例(20)Go 遍歷通道Go
- 清華尹成帶你實戰GO案例(25)Go 打點器Go
- 清華尹成帶你實戰GO案例(39)Go 結構體Go結構體
- 清華尹成帶你實戰GO案例(40)Go 程式觸發Go
- 清華尹成帶你實戰GO案例(41)Go 程式執行Go
- 清華尹成帶你實戰GO案例(50)Go 時間戳Go時間戳
- 清華尹成帶你實戰GO案例(53)Go 數字解析Go
- 清華尹成帶你實戰GO案例(55)Go 隨機數Go隨機