一个例子理解GO中函数的闭包

例子如下

package main

import "fmt"

func test(base int) (func(int) int, func(int) int) {
 
    add := func(i int) int {
        base += i
        return base
    }
    sub := func(i int) int {
        base -= i
        return base
    }
    return add, sub
}

func main() {
    f1, f2 := test(10)
    fmt.Println(f1(1), f2(2))//输出 11 9
    
}

一个test函数,返回值为2个func(int)int。从输出结果得知由于闭包的存在base在f1返回后其值仍然保留,即其生命周期不由作用域范围决定。

将主函数稍作修改

func main() {
	f1, _ := test(10)
	_, f2 := test(10)
	fmt.Println(f1(1), f2(2))//输出 11 8

}

此时f2的输出为8。这是因为f1与f2是在两次调用中分别赋值的,f2中的base值肯定不会受到其他调用的影响。

再将代码稍作修改

package main

import "fmt"

func test() (func(int) int, func(int) int) {
	base := 10
	add := func(i int) int {
		base += i
		return base
	}
	base = 10//调用f1,f2时不再执行
	sub := func(i int) int {
		base -= i
		return base
	}
	return add, sub
}

func main() {
	f1, f2 := test()
	fmt.Println(f1(1), f2(2)) //输出 11 9
}

将base的值改为由test()函数内部定义,此时f2的输出为9。说明了 “base=10” 这个语句仅仅在调用test()语句时执行。当执行f1,f2时指针已经分别位于两个不同的闭包函数,在f2执行前base仍等于11。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值