zoukankan      html  css  js  c++  java
  • Go语言中的闭包

    闭包是什么,闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)。

    有关这部分可以参看:http://www.cnblogs.com/ghj1976/archive/2013/02/08/2909364.html

    闭包包含着外部的环境变量值,但这个环境变量值并不像匿名函数那样作为参数副本,而是实实在在在的引用(或者指针,反正一个意思),当外部变量变化时,闭包能使用的值自然也就变化了。

    根据这个原理,下面罗列的几个闭包场景为何计算值是对应的值就很清楚了。

    下面例子来自: http://blog.csdn.net/liugao15/article/details/8296064

    
    

    例子1

    package main
     
    import"fmt"
     
    func main(){
        var fn [10]func()
     
        for i:=0;i<len(fn);i++{
            fn[i]=func(){
                fmt.Println(i)
            }
        }
        for_,f:=rangefn{
            f()
        }
    }
    输出值:

    10
    10
    10
    10
    10
    10
    10
    10
    10
    10
    exit code 0, process exited normally.

    原理:在执行f() 时,i 用的是之前定义的 i 的指针,由于之前已经完成了循环,这时候全部显示的是10.

    例子2

    package main
     
    import "fmt"
     
    func main(){
     
        var fn [10]func(int)
     
        for i:=0;i<len(fn);i++{
            fn[i]=make_fn()
        }
     
        for i,f:=range fn{ // 闭包中使用的是这个ide指针
            f(i)
        }
    }
     
    fund make_fn() func(i int){
        return func(i int){
            fmt.Println(i)
        }
    }
    输出:

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    exit code 0, process exited normally.

    下面例子来自:http://lelouchhe.github.com/one_thing_about_closure_in_go/

    例子3

    package main
     
    import(
        "fmt"
        "time"
    )
     
    func main(){
        for i:=0;i<100;i++{
            go func(){
                fmt.Println(i)
            }()
        }
        time.Sleep(1e9)
    }

    这个输出结果全部是100,因为这个循环运行的比goroutine还快,goroutine还没有开始,for循环已经结束了,此时i的值就是100了,所以闭包内的i自然就是100.

    
    
  • 相关阅读:
    用Github发布静态页面
    JS实现图片放大查看
    CSS3-字体渐变色
    Eclipse切换工作空间(Workspace)
    JS打开新的窗口
    HTML中特殊符号的处理
    PHP转码函数
    SecureCRT按退格键出现^H问题解决
    商人过河问题(二)java实现
    商人过河问题(一)
  • 原文地址:https://www.cnblogs.com/ghj1976/p/2909431.html
Copyright © 2011-2022 走看看