06 闭包函数

Go闭包是指在匿名函数中引用不属于该函数变量的格式,闭包 = 函数 + 引用环境

  • 引用函数中的变量情形
package main

func f() func () int{
	i := 0
	return func() int{
		i++
		return i
	}
}
func fa(a int ) func( i int) int{
	return func (i int) int {
		println(&a, a)
		a = a +i
		return a
	}
}

func main() {
	//函数f()与fa()均是返回匿名函数
	//引用外部作用域的变量
	c := f()
	e := f()
	//调用该函数多次,返回多个闭包,为多个副本
	f := fa(1)
	g := fa(1)

	println(f(1))
	println(g(1))

	//用一个闭包多次,均为同一个引用
	println(f(2))
	println(f(3))
}
  • 闭包引用全局变量
    因为全局变量作用范围的原因,全局变量唯一,所以闭包引用全局变量唯一
package main

import(
	"fmt"
)
var (  //定义初始化一个全局变量
	a=0
)

func fa() func(i int) int  {
	return func (i int) int {
		println(&a, a)
		a = a + i
		return a 
	}
}

func main() {
	
	f := fa()
	g := fa()

	fmt.Println(&f)  //不是同一个地址,副本复制
	fmt.Println(&g)

	println(f(1)) //但全局变量a唯一
	println(g(1))
	println(f(1))
	println(g(1))
}
  • 同一函数返回多个闭包,共享该函数的局部变量
func fb(base int) (func (int) int, func (int) int) {
	println("fb",&base, base)
	add := func(i int) int{
		base += i
		println("add",&base, base)
		return base
	}
	sub := func(i int) int{
		base -= i
		println("sub",&base, base)
		return base
	}
	return add, sub
	
}

func main() {
	//c,d共享一个base
	c,d := fb(0) //会输出一次&base,base 因为调用了fb函数
	//这边时将c,d初始化没有调用
	//f,g共享一个base
	f,g := fb(0)//会输出一次&base,base 因为调用了fb函数
	
	println("******")
	c(1) //调用c函数,输出&base, base
	println("******")
	d(1)
	println("******")
	println(c(1), d(1))
	println(f(1), g(1))
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值