go笔记——闭包

参考链接:https://www.wandouip.com/t5i91648/

1.闭包理解

闭包是一个函数值(把函数视为一等数据对象),它引用了函数体之外的变量(自由变量)。 这个函数可以对这个引用的变量进行访问和赋值;换句话说这个函数被“绑定”在这个变量上。一句关于闭包的名言: 对象是附有行为的数据,而闭包是附有数据的行为。

简单理解就是,闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。其底层类似于这种

type Closure struct {
    F func() int
    i *int
}

闭包是函数式语言中的概念,Go、Python等语言是支持闭包的,其实在java这种纯面向对象的语言中类就可以被视为闭包,因为从前面闭包的概念就可以看做,闭包就是对数据和函数的绑定,这不就是和java的类一样吗,包括了数据和方法,只是java不能像go、python这样将函数也视为一等对象,所以他只能通过内部类来实现这种闭包特性。其实无论是闭包也好,对象也好,都是一种数据封装的手段。
这里只是简单地讲一下在Go语言中闭包是如何实现的。

func f(i int) func() int {
    return func() int {
        i++
        return i
    }
}

函数f返回了一个函数,返回的这个函数就是一个闭包。这个函数中本身是没有定义变量i的,而是引用了它所在的环境(函数f)中的自由变量i。

c1 := f(0)
c2 := f(0)
c1() // reference to i, i = 0, return 1
c2() // reference to another i, i = 0, return 1

c1跟c2引用的是不同的环境,在调用i++时修改的不是同一个i,因此两次的输出都是1。函数f每进入一次,就形成了一个新的环境,对应的闭包中,函数都是同一个函数,环境却是引用不同的环境。变量i是函数f中的局部变量,假设这个变量是在函数f的栈中分配的,是不可以的。因为函数f返回以后,对应的栈就失效了,f返回的那个函数中变量i就引用一个失效的位置了。所以闭包的环境中引用的变量不能够在栈上分配。

2.闭包的作用

参考链接:http://dy.163.com/v2/article/detail/ECJBEBLP053158Q5.html

发布了69 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/JustKian/article/details/100669596