全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

深入理解Go语言中的闭包

闭包

在函数编程中经常用到闭包,闭包是什?它是怎么产生的及用来解决什么问题呢?先给出闭包的字面定义:闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。这个从字面上很难理解,特别对于一直使用命令式语言进行编程的程序员们。

Go语言中的闭包

先看一个demo:

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就引用一个失效的位置了。所以闭包的环境中引用的变量不能够在栈上分配。

escape analyze

在继续研究闭包的实现之前,先看一看Go的一个语言特性:

func f() *Cursor {
 var c Cursor
 c.X = 500
 noinline()
 return &c
}

Cursor是一个结构体,这种写法在C语言中是不允许的,因为变量c是在栈上分配的,当函数f返回后c的空间就失效了。但是,在Go语言规范中有说明,这种写法在Go语言中合法的。语言会自动地识别出这种情况并在堆上分配c的内存,而不是函数f的栈上。

为了验证这一点,可以观察函数f生成的汇编代码:

MOVQ $type."".Cursor+0(SB),(SP) // 取变量c的类型,也就是Cursor
PCDATA $0,$16
PCDATA $1,$0
CALL ,runtime.new(SB) // 调用new函数,相当于new(Cursor)
PCDATA $0,$-1
MOVQ 8(SP),AX // 取c.X的地址放到AX寄存器
MOVQ $500,(AX) // 将AX存放的内存地址的值赋为500
MOVQ AX,"".~r0+24(FP)
ADDQ $16,SP

识别出变量需要在堆上分配,是由编译器的一种叫escape analyze的技术实现的。

如果输入命令:

go build --gcflags=-m main.go

可以看到输出:

注意:最后两行,标识c逃逸了,被移动到堆中。escape analyze可以分析出变量的作用范围,这是对垃圾回收很重要的一项技术。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


# GO语言闭包  # golang闭包  # go.  # 闭包  # 举例讲解Go语言中函数的闭包使用  # Go基础教程系列之回调函数和闭包详解  # Go 中闭包的底层原理  # Go程序员踩过的defer坑错误处理  # Golang巧用defer进行错误处理的方法  # Go语言中的函数、闭包、defer、错误处理的学习教程  # 都是  # 是在  # 是由  # 先看  # 的是  # 是一个  # 这是  # 却是  # 很难  # 不可以  # 中有  # 两次  # 并在  # 它是  # 形成了  # 而成  # 很重要  # 可以看到  # 这种情况  # 再看 


相关文章: 如何选择适配移动端的WAP自助建站平台?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  MySQL查询结果复制到新表的方法(更新、插入)  如何快速生成可下载的建站源码工具?  如何选择最佳自助建站系统?快速指南解析优劣  建站之星CMS建站配置指南:模板选择与SEO优化技巧  建站之星CMS五站合一模板配置与SEO优化指南  高端企业智能建站程序:SEO优化与响应式模板定制开发  微信h5制作网站有哪些,免费微信H5页面制作工具?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  如何选择网络建站服务器?高效建站必看指南  如何撰写建站申请书?关键要点有哪些?  股票网站制作软件,网上股票怎么开户?  开源网站制作软件,开源网站什么意思?  如何通过wdcp面板快速创建网站?  动图在线制作网站有哪些,滑动动图图集怎么做?  如何在万网自助建站中设置域名及备案?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  常州企业网站制作公司,全国继续教育网怎么登录?  智能起名网站制作软件有哪些,制作logo的软件?  制作旅游网站html,怎样注册旅游网站?  宝塔新建站点报错如何解决?  宝塔建站无法访问?如何排查配置与端口问题?  如何高效搭建专业期货交易平台网站?  建站之星如何实现网站加密操作?  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  建站主机无法访问?如何排查域名与服务器问题  小型网站制作HTML,*游戏网站怎么搭建?    SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  建站之星备案流程有哪些注意事项?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  建站之星免费模板:自助建站系统与智能响应式一键生成  建站中国官网:模板定制+SEO优化+建站流程一站式指南  定制建站如何定义?其核心优势是什么?  建站之星客服服务时间及联系方式如何?  如何在建站之星网店版论坛获取技术支持?  高端建站三要素:定制模板、企业官网与响应式设计优化  如何注册花生壳免费域名并搭建个人网站?  清除minerd进程的简单方法  如何通过多用户协作模板快速搭建高效企业网站?  昆明高端网站制作公司,昆明公租房申请网上登录入口?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  如何通过FTP服务器快速搭建网站?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  如何用VPS主机快速搭建个人网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。