golang中闭包讲解

1. 非闭包时的结果

package main

import "fmt"

func main() {
	var funcSlice []func()
	for i := 0; i < 5; i++ {
		// 此处匿名函数创建了,但是匿名函数中的内容根本没有执行
		f := func() {
			fmt.Println(i)
		}
		funcSlice = append(funcSlice, f)
	}

	// 为什么输出都是5?
	// 因为匿名函数内部的代码for循环时不会执行,只有当下面调用匿名函数时才会执行,而且for循环退出条件是i=5时退出
	// 所有输出都是5
	funcSlice[0]()
	funcSlice[1]()
	funcSlice[2]()

}

  

2. 使用闭包时的结果

package main

import "fmt"

func main() {
	var funcSlice []func()
	for i := 0; i < 5; i++ {
		// 此处匿名函数创建了,但是匿名函数中的内容根本没有执行
		f := func(n1 int) func() {
			return func() {
				fmt.Println(n1)
			}
		}(i)
		funcSlice = append(funcSlice, f)
	}

	// 闭包:外函数的返回值是内函数的引用,内函数用到了外函数的临时变量
	// 为什么输出都是0、1、2
	// 因为for循环时,i已经值拷贝到n1里面去了,f执行的匿名函数中的n1与i已经没有关系了
	// f变量指向的是func里面包裹的func匿名函数
	// 所以输出是0、1、2
	funcSlice[0]()
	funcSlice[1]()
	funcSlice[2]()

}

  

posted @ 2021-10-16 10:14  专职  阅读(60)  评论(0编辑  收藏  举报