閉包
基本概念
閉包是可以包含自由(未繫結到特定物件)變數的程式碼塊,這些變數不在這個程式碼塊內或者任何全域性上下文中定義,而是在定義程式碼塊的環境中定義。要執行的程式碼塊(由於自由變數包含在程式碼塊中,所以這些自由變數以及它們引用的物件沒有被釋放)為自由變數提供繫結的計算環境(作用域)。
閉包的價值
閉包的價值在於可以作為函式物件或者匿名函式,對於型別系統而言,這意味著不僅要表示資料還要表示程式碼。將函式作為第一級物件,就是說這些函式可以儲存到變數中作為引數傳遞給其他函式,最重要的是能夠被函式動態建立和返回。
j := 5 a := func() func() { i := 10 return func() { fmt.Println(j, i) } }() a() j *= 2 a()
輸出:
example2:
f := add fmt.Println(f()(1)) fm := add() fmt.Println(fm(10)) fmt.Println(fm(100)) fmt.Println(fm(1000)) } func add() func(int) int { x := 0 return func(i int) int { x += i return x } }
輸出:
example3:
picture := suffix(".jpg") text := suffix(".txt") fmt.Println(picture("hello.jpg")) fmt.Println(text("hello")) } func suffix(su string) func(string) string { return func(name string) string { if strings.HasSuffix(name, su) { return name } return name + su } }
輸出:
hello.jpg hello.txt