首页 > 其他 > 详细

GO基础之闭包

时间:2019-11-01 00:33:21      阅读:112      评论:0      收藏:0      [点我收藏+]

一、闭包的理解

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

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

 

技术分享图片

 

 

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 := adder2()
    fmt.Println("res2=", res2)
    fmt.Println("result=", res2())
    fmt.Printf("%T \n", res2)
    
    //第二种方式 匿名闭包
    res3 := func() func() int {
        num := 0
        return func() int {
            num++
            return num
        }
    }()
    fmt.Println("res3=", res2)
    fmt.Println("result=", 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给回收内存了,会一直缓存在那里)。

GO基础之闭包

原文:https://www.cnblogs.com/jalja/p/11774458.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!