go 闭包程序解读

Posted guojiayi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
", res)        //res 的类型就是函数形 func() int
    fmt.Printf("%T
", 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
", res1)       //   res1 := Counter() res1就是函数名,res1 = func()int
    fmt.Printf("%T
", 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 闭包程序解读的主要内容,如果未能解决你的问题,请参考以下文章

Go语言中的闭包

Go 匿名函数与闭包的使用

go语言中的闭包

Go语言迎来全迸发时代,未来全面覆盖程序开发领域丨解读2015

Go 中闭包的底层原理

Go 中闭包的底层原理