go 闭包程序解读

package main

import "fmt"

// 下面这函数就是闭包函数(就是返回一个匿名函数的地址的函数,其中要1.定义一个需要保护的局部变量i  2.一个匿名的函数) ,实现计数的功能
func Counter() func() int {
	i := 0
	res := func() int {
		i++
		return i

	}
	fmt.Println("Counter内部:", res) //0x49d5d0是匿名函数的地址  res就是func() int这个匿名函数
	fmt.Printf("%T\n", res)        //res 的类型就是函数形 func() int
	fmt.Printf("%T\n", res())      //res()是执行匿名函数,执行完返回值是1(int)

	fmt.Println("res():", res()) //打印是2的原因是res()是执行匿名函数,执行一次,匿名函数中的变量就运算一次且运行完后变量不被清理
	fmt.Println("res():", res()) //这是第三次运行函数res()
	return res                   //Counter函数返回的是 匿名函数的地址

}

func main() {

	res1 := Counter()              //执行Counter() 然后将返回值赋值给res1 ,res1 就是func() int类型变量
	fmt.Printf("%T\n", res1)       //   res1 := Counter() res1就是函数名,res1 = func()int
	fmt.Printf("%T\n", res1())     // res1()是执行func()int匿名函数,那么返回是Int
	fmt.Println("res1():", res1)   // 打印的地址和上面一样
	fmt.Println("res1():", res1()) //这是第5次运行函数res() 5
	fmt.Println("res1():", res1()) //这是第6次运行函数res() 6

	res2 := Counter()
	fmt.Println("res2():", res2)   //  内存地址不发生改变 和res1一致
	fmt.Println("res2():", res2()) // 但是重新进入了一次闭包函数 故i变量从0重新赋值了一遍
	fmt.Println("res2():", res2())
}

posted @ 2019-03-05 08:45  麦克郭  阅读(129)  评论(0编辑  收藏  举报