zoukankan      html  css  js  c++  java
  • GO基础之闭包

    一、闭包的理解

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

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

    package main
    
    import "fmt"
    
    func main() {
        //第一种方式
        res := adder()
        fmt.Printf("%T 
    ", 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 
    ", 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给回收内存了,会一直缓存在那里)。

  • 相关阅读:
    IOS之UIAlert​Controller
    IOS实现弹出菜单效果MenuViewController(背景 景深 弹出菜单)
    IOS之正则表达式
    死锁与递归锁
    线程与进程的一些应用
    开启线程的两种方式
    互斥锁
    进程的队列
    模拟抢票系统
    Python并发编程__多进程
  • 原文地址:https://www.cnblogs.com/jalja/p/11774458.html
Copyright © 2011-2022 走看看