清華尹成帶你實戰GO案例(18)Go 閉包函式

尹成發表於2018-05-21
Go 閉包函式
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


相關文章