FuncClosure闭包函数

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
  1. Go闭包的小结:闭包基本上就是上边的函数这样,函数内部引用了变量,无非就是作用域的问题。

  2. 注意:注意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
原文地址:https://www.cnblogs.com/maomaomaoge/p/14129376.html