funcadder()func(value int)int{
sum :=0// 自由变量// 函数返回的时候不只是返回一个函数,而是返回一个闭包 包括自由变量和局部变量returnfunc(value int)int{// value 局部变量
sum += value
return sum
}}funcmain(){
adder :=adder()// 闭包for i :=0; i <10; i++{
fmt.Println(adder(i))}//0//1//3//6//10//15//21//28//36//45}
例子
斐波那契数列
package main
funcfibonacci()func()int{
a, b :=0,1returnfunc()int{
a, b = b, a+b
return a
}}funcmain(){
f :=fibonacci()println(f())//1println(f())//1println(f())//2println(f())//3println(f())//5}
斐波那契数列2
funcfibonacci() intGen {
a, b :=0,1returnfunc()int{
a, b = b, a+b
return a
}}// 给函数实现接口,在go语言中 只要是类型,就可以实现接口type intGen func()int// 让函数实现Read接口func(g intGen)Read(p []byte)(n int, err error){
next :=g()
s := fmt.Sprintf("%d\n", next)if next >200{return0, io.EOF
}return strings.NewReader(s).Read(p)//找个代理帮助我们读取}funcprintFileContents(reader io.Reader){
scanner := bufio.NewScanner(reader)for scanner.Scan(){
fmt.Println(scanner.Text())}}funcmain(){
f :=fibonacci()printFileContents(f)//因为函数实现了Reader接口,所以就可以作为参数传入//1//1//2//3//5//8//13//21//34//55//89//144}