157°

GO基础之闭包

一、闭包的理解

闭包是匿名函数与匿名函数所引用环境的组合。匿名函数有动态创建的特性,该特性使得匿名函数不用通过参数传递的方式,就可以直接引用外部的变量。

这就类似于常规函数直接使用全局变量一样,个人理解为:匿名函数和它引用的变量以及环境,类似常规函数引用全局变量处于一个包的环境。

 

 

 

package main

import "fmt"

func main() { //第一种方式 res := adder() fmt.Printf("%T \n", res) for i := 0; i < 5; i++ { fmt.Println("i=", i, "sum=", res(i)) }

res2 :</span>=<span style="color: #000000;"> adder2()
fmt.Println(</span><span style="color: #800000;">"</span><span style="color: #800000;">res2=</span><span style="color: #800000;">"</span><span style="color: #000000;">, res2)
fmt.Println(</span><span style="color: #800000;">"</span><span style="color: #800000;">result=</span><span style="color: #800000;">"</span><span style="color: #000000;">, res2())
fmt.Printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">%T \n</span><span style="color: #800000;">"</span><span style="color: #000000;">, res2)

</span><span style="color: #008000;">//</span><span style="color: #008000;">第二种方式 匿名闭包</span>
res3 := func() func() <span style="color: #0000ff;">int</span><span style="color: #000000;"> {
    num :</span>= <span style="color: #800080;">0</span>
    <span style="color: #0000ff;">return</span> func() <span style="color: #0000ff;">int</span><span style="color: #000000;"> {
        num</span>++
        <span style="color: #0000ff;">return</span><span style="color: #000000;"> num
    }
}()
fmt.Println(</span><span style="color: #800000;">"</span><span style="color: #800000;">res3=</span><span style="color: #800000;">"</span><span style="color: #000000;">, res2)
fmt.Println(</span><span style="color: #800000;">"</span><span style="color: #800000;">result=</span><span style="color: #800000;">"</span><span style="color: #000000;">, res3())

}

//定义一个闭包函数 实现累加器 func adder() func(int) int { sum := 0 res := func(num int) int { sum += num return sum } return res } //定义一个无参闭包函数 实现累加器 func adder2() func() int { sum := 0 res := func() int { sum++ return sum } fmt.Println("res=", res) return res }

 没有闭包的时候,函数就是一次性买卖,函数执行完毕后就无法再更改函数中变量的值(应该是内存释放了);有了闭包后函数就成为了一个变量的值,只要变量没被释放,函数就会一直处于存活并独享的状态,因此可以后期更改函数中变量的值(因为这样就不会被go给回收内存了,会一直缓存在那里)。

本文转载自博客园,原文链接:https://www.cnblogs.com/jalja/p/11774458.html

全部评论: 0

    我有话说: