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
    

      

  • 相关阅读:
    针对性博文
    spring事务
    Redis_主从模式_哨兵模式_Cluster集群模式
    Redis AOF、RDB持久化
    Redis 高可用分布式集群
    Redis 基础
    Oracle优化学习
    Mysql:索引实战
    Mysql:性能优化
    js 二维数组定义
  • 原文地址:https://www.cnblogs.com/nulige/p/10232893.html
Copyright © 2011-2022 走看看