zoukankan      html  css  js  c++  java
  • go语言基础之闭包的特点

           所谓闭包就是一个函数“捕获”了和它在同一作用域的其它常量和变量。这就意味着当闭包被调用的时候,不管在程序什么地方调用,闭包能够使用这些常量或者变量。它不关心这些捕获了的变量和常量是否已经超出了作用域,所以只有闭包还在使用它,这些变量就还会存在。

    1、闭包的特点

    示例1:  函数调用完毕,x自动释放

    package main //必须
    
    import "fmt"
    
    func test01() int {
    	//函数被调用时,x才分配空间,才初始化为0
    	var x int //没有初始化,值为0
    	x++
    	return x * x  //函数调用完毕,x自动释放
    }
    
    func main() {
    	fmt.Println(test01())
    	fmt.Println(test01())
    	fmt.Println(test01())
    	fmt.Println(test01())
    
    }
    

    执行结果:

    1
    1
    1
    1
    

    2、闭包的特点 (备注:变量不会释放,还会存在)

    //返回值为一个匿名函数,返回一个函数类型,通过f来调用返回的匿名函数,f来调用闭包函数
    //它不关心这些捕获了的变量和常量是否已经超出了作用域
    //所以只有闭包还在使用它,这些变量就还会存在。

    示例2:

    package main //必须
    
    import "fmt"
    
    //函数的返回值是一个匿名函数,返回一个函数类型
    func test02() func() int {
    	var x int  //没有初始化,值为0
    
    	return func() int {
    		x++
    		return x * x
    	}
    }
    
    func main() {
    	//返回值为一个匿名函数,返回一个函数类型,通过f来调用返回的匿名函数,f来调用闭包函数
    	//它不关心这些捕获了的变量和常量是否已经超出了作用域
    	//所以只有闭包还在使用它,这些变量就还会存在。
    	f := test02()
    	fmt.Println(f())
    	fmt.Println(f())
    	fmt.Println(f())
    	fmt.Println(f())
    	fmt.Println(f())
    }
    

    执行结果:

    1
    4
    9
    16
    25
    

      

  • 相关阅读:
    从跳频技术聊CDMA/WIFI之母海蒂·拉玛传奇的一生
    echarts图表X轴文字过长解决解决方案:根据文字长度自动旋转
    kafka-connect-kudu-sink插件
    mysql8远程连接问题
    zookeeper-3.4.5修改存储1M大小限制
    Java并发之CompletionService详解
    傲视Kubernetes(六):Pod管理及控制器
    傲视Kubernetes(五):注解和命名空间
    Es使用kibana增删改查以及复杂查询
    测试Ik分词器以及增加自己的词汇
  • 原文地址:https://www.cnblogs.com/nulige/p/10232893.html
Copyright © 2011-2022 走看看