【Go语言】闭包通俗易懂的代码案例

什么是闭包?

百度百科是这么形容的:闭包就是能够读取其他函数内部变量的函数。(能看懂的大概是怪物)

看完概念大部分人应该都处于蒙圈的状态,所以我决定用一段代码来解释下闭包。

// 一个累加器(闭包)
func AddUpper() func (int) int {
	num := 10
	return func (x int) int{  //这是一个匿名函数
		num = num + x
		return num
	}
}

func main() {
	f := AddUpper()  // 这个括号非常关键,与 f:= AddUpper不同!这一步相当于已经调用了AppUpper函数
	fmt.Printf("f的类型是%T\n", f)  // func(int) int类型,也就是说,现在的f实际是闭包内的匿名函数
	fmt.Println(f(1))  // 输出11
	fmt.Println(f(2))  // 输出13,而不是12
	fmt.Println(f(3))  // 输出16
}

闭包函数返回的也是一个函数。

当我们用变量f来接收闭包函数时,得到的其实是内部的匿名函数,只要变量f没有被回收,那么变量num就不会被重置。

通俗解释:当变量f接收了闭包函数时,num就相当于一个全局变量,可以被更改并保存,而f(1)就是直接调用了匿名函数,并把1传给形参x。

注:如果我们用一个新的变量nefF接收闭包函数时,在这个新的变量中,变量num就会被重置为10,而变量f中的num却不会被重置。

func main() {
	f := AddUpper()
	fmt.Printf("f的类型是%T\n", f)
	fmt.Println(f(1))  // 11
	fmt.Println(f(2))  // 13
	fmt.Println(f(3))  // 16
	
	newF:= AddUpper()
	fmt.Println(newF (1))  // 11
	fmt.Println(newF (2))  // 13
	fmt.Println(newF (3))  // 16
	
	fmt.Println(f(1))  // 17
}

闭包的概念比较抽象,建议看完依然对闭包一知半解的读者可以自己敲一敲代码,并通过代码的运行结果来反推闭包的概念,或者也可以留言一起探讨~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值