美文网首页Go Lang 实战
GO函数-闭包(二)

GO函数-闭包(二)

作者: 草莓君_ | 来源:发表于2019-08-01 15:56 被阅读0次

闭包是在其词法上下文中引用了自由变量的函数。或者说是函数和其引用的环境的组合体。

func test(x int) func() {
    return func() {
        println(x)
    }
}

func main() {
    f := test(123)
    f()
}

输出:

123

如上边案例:test 返回的匿名函数会引用上下文环境变量x。当该函数在main中执行时,它依然可以正确读取x的值,这种现象称作闭包。
1.闭包的延迟求值特性

func test() []func()  {
    var s []func()

    for i := 0; i<2; i++ {
        s = append(s, func() {    //将多个匿名函数添加到列表
            println(&i, i)
        })
    }
    return s          //返回匿名函数列表
}

func main() {
    for _, f := range test() {   //迭代执行所有匿名函数
        f()
    }
}

输出:

0xc000014078 2
0xc000014078 2

我们可以看出输出输出结果并不是我们想象中的样子,因为,for循环复用局部变量i,那么每次添加的匿名函数引用的自然是同一变量。添加操作仅仅是将匿名函数放入列表,并未执行。因此当main函数执行这些函数时,它们读取的是环境变量i最后一次循环的值。
那么有什么解决方式么?可以这样,每次用不同的环境变量或参数复制,让各自闭包的环境各不相同。
改造下:

func test() []func()  {
    var s []func()

    for i := 0; i<2; i++ {
        x := i            //每次循环都重新定义
        s = append(s, func() {
            println(&x, x)
        })
    }
    return s
}

func main() {
    for _, f := range test() {
        f()
    }
}

输出:

0xc000014078 0
0xc000014090 1

相关文章

  • 第02天(函数、工程管理)_03

    11_函数类型.go 12_回调函数.go 13_匿名函数和闭包.go 14_闭包捕获外部变量的特点.go 15_...

  • GO函数-闭包(二)

    闭包是在其词法上下文中引用了自由变量的函数。或者说是函数和其引用的环境的组合体。 输出: 如上边案例:test 返...

  • 26. 函数闭包

    如果非必要,尽量不要在程序中使用闭包。go函数可以是一个闭包。闭包是一个函数值,它引用了函数体之外的变量。这个函数...

  • 函数对象和闭包

    函数对象和闭包 一) 函数对象 示例: 二)函数嵌套 三)闭包函数

  • Golang学习笔记-函数

    Go函数定义格式如下: 例如: Go可以很灵活的创建函数,并作为另外一个函数的实参: Go支持匿名函数,可作为闭包...

  • Go语言中的函数 为什么是一等公民

    关键点 Go语言中,支持: 普通函数 匿名函数 闭包 在Go语言中,函数属于一等公民(first-class)? ...

  • 理解javascript(匿名函数和闭包)这篇文章就够了

    匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数。 一.匿名函数 二:闭包 闭包的概念:闭包是指...

  • 08. Go极简教程 函数及闭包

    Golang中, 函数是一等公民, 以下简要描述函数的使用 函数的声明 闭包 引用官方的解释: Go 函数可以是闭...

  • Go lang 学习,函数闭包

    Go 函数可以是闭包的。闭包是一个函数值,它来自函数体的外部的变量引用。 函数可以对这个引用值进行访问和赋值;换句...

  • 第三周第二天

    第三周第二天 函数作为参数,匿名函数(闭包)尾随闭包 闭包,尾随闭包 数组的过滤,缩减,映射

网友评论

    本文标题:GO函数-闭包(二)

    本文链接:https://www.haomeiwen.com/subject/nuwqdctx.html