packagemain
import"fmt"
funcmain(){
add:=func(baseint)func(int)(int){
returnfunc(iint)(int){
returnbase+i
}
}
add5:=add(5)
fmt.Println("add5(10)=",add5(10))
}
閉包的聲明是在另一個函數的內部,形成嵌套。和塊的嵌套一樣,內層的變量可以遮蓋同名的外層的變量,而且外層變量可以直接在內層使用。如add的base參數在return返回的閉包的外層,所以它的值5在add返回并賦值給add5后依舊存在。當add5執行時,參數i可以從這個外層得到的base相加,得到結果15.
package main
import "fmt"
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
func main() {
pos, neg := adder(), adder()
for i := 0; i 10; i++ {
fmt.Println(
pos(i),
neg(-2*i),
)
}
}