26. 函数闭包

作者: 厚土火焱 | 来源:发表于2017-08-17 15:13 被阅读139次

如果非必要,尽量不要在程序中使用闭包。
go函数可以是一个闭包。闭包是一个函数值,它引用了函数体之外的变量。这个函数可以对这个变量进行访问和赋值。
展示一个例子

package main

import "fmt"

func adder() func(int) int  {
    sum := 0
    return func(x int) int {
        sum += x
        return sum
    }
}
func main() {
    pos, neg := adder(), adder()
    for i := 0; i < 10; i++ {
        fmt.Println(
            pos(i),
            neg(-2*i),
        )
    }
}

运行结果

0 0
1 -2
3 -6
6 -12
10 -20
15 -30
21 -42
28 -56
36 -72
45 -90

函数 adder() 内 return 了一个函数值,这个函数值引用了外部的 sum ,形成了一个闭包。
是不是有点看不懂?
好吧,其实 pos(i) 的这个 i ,是给进了 return func(x int) int 里的 x 了。
我们修改一下上面的代码,增加几个输出语句。然后再看看运行结果。

package main

import "fmt"

func adder() func(int) int  {
    sum := 0
    fmt.Println("外边的sum",sum)
    return func(x int) int {
        fmt.Print("里边的x", x, " --> ")
        sum += x
        return sum
    }
}
func main() {
    pos, neg := adder(), adder()
    for i := 0; i < 10; i++ {
        fmt.Println(
            pos(i),
            neg(-2*i),
        )
    }
}

增加了输出的运行结果

外边的sum 0
外边的sum 0
里边的x0 --> 里边的x0 --> 0 0
里边的x1 --> 里边的x-2 --> 1 -2
里边的x2 --> 里边的x-4 --> 3 -6
里边的x3 --> 里边的x-6 --> 6 -12
里边的x4 --> 里边的x-8 --> 10 -20
里边的x5 --> 里边的x-10 --> 15 -30
里边的x6 --> 里边的x-12 --> 21 -42
里边的x7 --> 里边的x-14 --> 28 -56
里边的x8 --> 里边的x-16 --> 36 -72
里边的x9 --> 里边的x-18 --> 45 -90

这次看明白了么?
外边的 sum 那个位置只是被调用时执行了一次, pos 和 neg 每次循环给入的变量都在 return func(x int) int 内累加。外面的语句没有再执行。
adder() 返回了 func(int) int
func(int) 返回了 int
于是最后那条语句就是打印出两个整数来。
至于,为什么先打印出 2 条“里边的”,之后才打印出 2 个整数。还记得 go 语言的栈么?就是这个原因了。后进先出,先要分别执行完 pos 和 neg ,才能执行 Println 这句了。

相关文章

  • 26. 函数闭包

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

  • 如何理解闭包?

    1、定义: 嵌套在函数作用域中的函数,称为闭包函数。该作用域称为闭包环境。通过闭包函数可以访问闭包函数所在函数作用...

  • 关于逃逸闭包

    逃逸闭包:当函数执行结束后,才去调用函数内部的闭包,叫做逃逸闭包非逃逸闭包当函数执行过程中,执行的函数内部的闭包,...

  • 3.逃逸闭包,非逃逸闭包

    逃逸闭包:当函数执行结束后,才去调用函数内部的闭包,叫做逃逸闭包非逃逸闭包:当函数执行过程中,执行的函数内部的闭包...

  • (9) python之闭包

    闭包闭包 = 函数 + 环境变量(函数定义的时候) 一个最简单的闭包 闭包不受外部变量影响 非闭包 闭包 闭包 只...

  • day14-函数(3)装饰器

    一、闭包函数 闭包函数=函数嵌套定义+函数对象+名称空间与作用域 闭包函数 1、闭:指的是该函数是定义在一个函数内...

  • 面试题(day-2)

    1 ,什么是闭包?闭包有什么好处?使用闭包要注意什么? 闭包:函数嵌套函数,内部函数可以引用外部函数的参数和变量,...

  • JS的闭包

    1.闭包的概念 闭包函数:声明在一个函数中的函数,叫做闭包函数。闭包:内部函数总是可以访问其所在的外部函数中声明的...

  • python函数之闭包

    目录 python函数之闭包什么是闭包python中的namespace闭包的条件闭包的优点 python函数之闭...

  • 2018-07-10swift4与swift 3.3 语法重拾(

    函数与闭包 闭包

网友评论

本文标题:26. 函数闭包

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