FuncClosure闭包函数
对于闭包,无论是哪个语言都有,这玩意给在玩js时候,给我的印象就是他的局部变量不消失。那我们来看看大神的想法:
闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁
首先我们实现一个简单的闭包
package closure
import (
"fmt"
)
func ClosureBase() func(x1 int, x2 int) int {
i := 0
return func(x1 int, x2 int) int {
i++
fmt.Println("此时闭包里面的i的值:", i)
sum := i + x1 + x2
return sum
}
}
随后,我们进行函数测试
package closure
import (
"fmt"
"testing"
)
func TestClosureBase(t *testing.T) {
fmt.Println("---------f1函数测试-----------------")
f1 := ClosureBase()
fmt.Println(f1(1, 1))
fmt.Println(f1(1, 1))
fmt.Println(f1(1, 1))
fmt.Println("------------------f2函数测试---------------")
f2 := ClosureBase()
fmt.Println(f2(1, 1))
fmt.Println(f2(1, 1))
fmt.Println(f2(1, 1))
}
测试输出
我是tmp
此时闭包里面的i的值: 1
3
此时闭包里面的i的值: 2
4
此时闭包里面的i的值: 3
5
------------------f2函数测试---------------
我是tmp
此时闭包里面的i的值: 1
3
此时闭包里面的i的值: 2
4
此时闭包里面的i的值: 3
5
-
Go闭包的小结:闭包基本上就是上边的函数这样,函数内部引用了变量,无非就是作用域的问题。
-
注意:注意tmp的输出,你会发现函数第二次就不经过它了(尤其是这种边缘化的细节,笔试就喜欢这些)
闭包应用
对于斐波那切数列,我们总是用递归玩,下面我们就用闭包看看如何
菲波那切数列实现
代码实现
package closure
import "fmt"
func Fbi() func() int {
fmt.Println("函数经过跑下面这俩了吗")
b0 := 0
b1 := 1
return func() int {
tmp := b0 + b1
b0 = b1
b1 = tmp
return b1
}
}
测试代码
func TestFbi(t *testing.T) {
fmt.Println("斐波那切数列,非递归")
f := Fbi()
for i := 1; i <= 4; i++ {
fmt.Println(f())
}
}
输出结果
斐波那切数列,非递归
函数经过跑下面这俩了吗
1
2
3
5