GoLang学习笔记(十三)闭包的定义及用法

版权声明:如需转载、粘贴内容,必须在转载和粘贴文中标明文章内容出至 https://blog.csdn.net/ynzcxx/article/details/84141088

其实匿名函数就是闭包

写一个不使用闭包的实现的计数器

func add1() {
	val := 0
	for i := 0; i < 10; i++ {
		fmt.Printf("i=%d \t", i)
		val += add2(i)
		fmt.Println(val)
	}
	fmt.Println("总和为:", val)
}

func add2(x int) int {
	sum := 0
	sum += x
	return sum
}

当运行add1()函数的时候,会给出结果

i=0 	0
i=1 	1
i=2 	3
i=3 	6
i=4 	10
i=5 	15
i=6 	21
i=7 	28
i=8 	36
i=9 	45
总和为: 45

记录了计数并叠加的结果。

对比一下,再写一个使用闭包的计数器,并和上面的输出结果一致

func adder1() {
	result := adder2()
	for i := 0; i < 10; i++ {
		fmt.Printf("i=%d \t", i)
		fmt.Println(result(i))
	}
}

func adder2() func(int) int {
	sum := 0
	result := func(num int) int {
		sum += num
		return sum
	}
	return result
}

最后来写另外一个闭包计数器,当每次调用方法时,计数器加1。

func counter1() {
	res := counter2()
	fmt.Printf("%T \n", res)
	fmt.Println("res:", res)   
	fmt.Println("res:", res()) 
	fmt.Println("res:", res()) 
	fmt.Println("res:", res()) 
}

func counter2() func() int {
	i := 0
	res := func() int {
		i++
		return i
	}
	return res
}

当执行counter1()函数里的res()一次,计数器加1一次,所以输出的结果第一行就是res的数据类型,第二行就是res的内存地址,第三行为1,第四行为2,第五行为3……以此类推。

func() int 
res: 0x490070
res: 1
res: 2
res: 3

猜你喜欢

转载自blog.csdn.net/ynzcxx/article/details/84141088
今日推荐