美文网首页go学习
golang闭包分析

golang闭包分析

作者: 初级赛亚人 | 来源:发表于2017-09-30 16:18 被阅读120次

在你接触过的编程语言中,或多或少的都接触过闭包。

那什么是闭包?

       闭包包含自由(未绑定到特定对象)变量;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)——摘自百度

golang中的闭包

在golang中实现闭包是很简单的一件事,比如:

下面我们来分析一下这个闭包,函数closure()是一个不需要参数,返回一个类型为func(int)int类型的函数,在main()中,我们用A来接收闭包closure返回的这个func,此时就相当于A是一个func(int)int类型的函数,对A进行调用A(5),返回结果用一个x变量来接收,然后打印结果。

如果你对c语言还有一些记忆,那就知道closure()函数中的这种写法是不被允许的,原因是c在函数内,内存分配是分配在栈上的,函数closure()返回之后这部分栈空间就失效了;但是在go语言里,这里却能正常运行。我们尝试来分析一下其中的原因。

用gdb来跟踪看看有什么结果:

使用命令go build -gcflags "-N -l -m" closure  

其中closure就是上面闭包的那个工程,看看打印了什么重要消息:

什么?&x escapes to heap???难怪我们对A函数的调用没出现任何问题,敢情变量x坐飞机逃到heap里面去了,这就说明go语言会自动地识别出这种情况并在堆上分配x的内存,而不是函数closure的栈上。

相关文章

  • golang闭包分析

    在你接触过的编程语言中,或多或少的都接触过闭包。 那什么是闭包? 闭包包含自由(未绑定到特定对象)变量;这些...

  • Closure in Golang

    序言 Golang遵循“少即是多”的设计哲学,同时又支持闭包(Closure),那么闭包对于Golang来说肯定有...

  • GO语言面试系列:(三)关于golang闭包所谓的“坑”

    关于golang闭包所谓的“坑”,昨天听了某企业架构师关于golang的经验分享,听到架构师吐槽golang里的闭...

  • golang闭包

    闭包的安全性与变量生命周期

  • Golang 闭包

    输出:

  • golang-闭包

    最近学习golang的匿名函数 发现闭包还是有点意思 闭包基本概念:闭包是可以包含自由(未绑定到特定对象)变量的代...

  • Swift-进阶 :闭包(二)逃逸闭包 & 非逃逸闭包

    本文主要分析逃逸闭包 、非逃逸闭包、自动闭包 逃逸闭包 & 非逃逸闭包 逃逸闭包定义 当闭包作为一个实际参数传递给...

  • golang

    golang中闭包的问题 熟悉go语言的开发者都知道,go的闭包是可以记录状态的。当我想用闭包来实现保存某一str...

  • golang:函数闭包

    From wiki 闭包在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure...

  • golang函数闭包

    定义 Go 语言支持匿名函数,可作为闭包。匿名函数是一个"内联"语句或表达式。匿名函数的优越性在于可以直接使用函数...

网友评论

    本文标题:golang闭包分析

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