码迷,mamicode.com
首页 > 其他好文 > 详细

go 闭包程序解读

时间:2019-03-05 09:16:33      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:counter   print   package   匿名函数   ret   ++   三次   pac   实现   

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())
}

技术图片

go 闭包程序解读

标签:counter   print   package   匿名函数   ret   ++   三次   pac   实现   

原文地址:https://www.cnblogs.com/guojiayi/p/10474531.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!