当前位置: 首页 > news >正文

邹城网站建设公司网站建设服务商

邹城网站建设公司,网站建设服务商,成华区响应式网站建设,wordpress粉丝主题一、简介 闭包(Closure)是一种编程概念,它允许函数捕获并记住其创建时的上下文环境(包括变量)。闭包通常用于函数式编程语言,但在许多现代编程语言中也有支持,包括 Go ,Js等支持函数…

一、简介

闭包(Closure)是一种编程概念,它允许函数捕获并记住其创建时的上下文环境(包括变量)。闭包通常用于函数式编程语言,但在许多现代编程语言中也有支持,包括 Go ,Js等支持函数式编程的编程语言。
说的简单一点就是,闭包是一个函数值,它引用了其创建时的自由变量(即非局部变量)。当闭包被调用时,它会访问这些变量的值,即使这些变量在闭包创建时的作用域已经结束。闭包的核心特性包括:
函数值:闭包本质上是一个函数。
捕获上下文:闭包可以捕获并记住其创建时的变量状态。
持久化变量:即使创建闭包的作用域已经结束,闭包仍然可以访问这些变量。
是不是看的很头大,我们来用代码来描述一下。

二、golang中的闭包

golang作为一个现代编程语言,虽然众多褒贬不一但是他确实支持了很多现代编程语言的特点,比如函数编程。

package mainimport ("fmt"
)// 定义一个函数 addCounter,它返回一个匿名函数(闭包)。
func addCounter() func() {// 定义一个局部变量 count,它是一个整数,初始值为 0。// 这个变量是闭包的“状态”,它会被闭包捕获。var count int = 0// 返回一个匿名函数,这个匿名函数可以访问并修改外部的 count 变量。return func() {// 每次调用这个匿名函数时,count 的值会加 1。count += 1// 打印当前 count 的值。fmt.Printf("count is %d\n", count)}
}func main() {var add1 = addCounter()add1() // 输出: 1add1() // 输出: 2
}

这个函数addCounter的特点如下:
1、名称为addCounter
2、入参为空,该函数没有入参。
3、返回值是一个函数,这个返回值函数的类型就更简单了,入参和出参都没有。

但是重点就在于这个addCounter的返回函数,我们来单独看这一段逻辑(我们称之为内部函数):

return func() {// 闭包函数count += 1fmt.Printf("count is %d\n", count)
}

逻辑很简单,就是对count变量做了一个+1的操作,但是这个count不是这个返回函数里面,他是在他的外部函数addCounter中声明的,而这个内部函数就是闭包,返回一个匿名函数(闭包)。这个匿名函数可以访问并修改 addCounter 中的 count 变量。该闭包捕获了来自外部函数的变量,当捕获完成后,此时该变量的生命周期就发生了变化。
具体我们再往下看:
我们在主函数中调用逻辑:

func main() {var add1 = addCounter()add1() // 输出: 1add1() // 输出: 2
}

我们调用var add1 = addCounter(),返回了一个add1变量,此时这就调用了这个外部函数,并且返回了内部函数给add1,注意,此时addCounter()函数调用已经结束了,那么在我们常规的理解中,当一个函数调用结束,函数中创建的变量自然也是结束了,被销毁了(我们没有返回)。但是闭包这里不同,闭包在创建的时候捕获了这个变量count,此时虽然 addCounter调用结束了,但它捕获了 addCounter 中的 count 变量。即使 addCounter 函数的执行结束,count 变量仍然被匿名函数记住,并且可以在后续调用中继续使用。这就是闭包的核心,闭包捕获外部变量,即便外部变量所在的函数已经调用结束了,但是闭包依然可以使用该变量。这就是我们为啥看到的输出1,2.
因为当var add1 = addCounter() 执行,第一个闭包被创建,也就是add1,我们多次执行该闭包,都是能访问该被闭包捕获的变量的。

但是如果我们改成这样。

func main() {var add1 = addCounter()add1() // 输出: 1var add2 = addCounter()add2() // 输出: 1
}

此时就会输出两个1,因为你第二次调用var add2 = addCounter(),此时创建的是一个新的闭包,并将返回的闭包赋值给变量 add2。这里的 add2 是一个独立的闭包,它有自己的 count 变量,重新初始化为0,所以就输出都是1。

这基本就是闭包的概念,这个概念也是因为内部匿名函数封闭并包围作用域中的变量而得名的。

三、总结

闭包的主要特点就是:

捕获变量:闭包捕获了其创建时的变量(如 count),即使这些变量在其原始作用域中已经不可访问,就像我们初始化count的函数addCounter已经结束了,但是他还是被闭包捕获到了。独立状态:每个闭包实例都有自己的独立状态。add1 和 add2 是两个独立的闭包,它们各自维护自己的 count 变量。延迟求值:闭包在被调用时才计算其捕获的变量的值,而不是在创建时。函数式编程的特点大多如此。我们在java中使用lambda作为参数的时候也是如此。

go语言编程规范
effective_go

http://www.cadmedia.cn/news/8104.html

相关文章:

  • 城乡建设委员会网站房产栏目正规app推广
  • 管理咨询公司是做什么的百度关键词优化手段
  • 有名网站建设公司搜索引擎优化方法案例
  • 陕西正天建设有限公司网站推广软件有哪些
  • 营销型网站建设需要有什么功能百度网页版电脑版
  • 静海网站建设制作有哪些网络营销公司
  • 纯mvc做的都有那些网站网络整合营销理论案例
  • 开发小网站一般多少钱一个深圳做网站seo
  • 电商是怎么做的公司seo是什么级别
  • 建设工程用地批准手续在哪个网站好的竞价账户托管外包
  • 重庆哪家在做网站建设seo入门书籍推荐
  • 湛江专业网站建设怎么做网络媒体发稿
  • 网站建设女装规划书宁波免费seo排名优化
  • 深圳短视频关键词搜索排名推广长沙优化排名推广
  • 个人电子商务网站建设厦门站长优化工具
  • 浙江平台网站建设公司品牌营销策划公司哪家好
  • 上海公司起名seo排名快速刷
  • 网站建设适合的企业网站seo哪家好
  • 济南做网站的公司有哪些搜索引擎营销方法主要有三种
  • 网站建设 知识库手机端关键词排名免费软件
  • 北京市住房和建设委员会网站微信scrm系统
  • 外贸推广建站公司安卓优化大师手机版
  • 学校网站平台建设设计一个公司网站多少钱
  • 宜昌 网站建设 公司服装品牌策划及营销推广方案
  • 安徽省建设厅执业资格注册中心网站营销知识和技巧
  • 政府网站内容建设情况及成效信息流优化师简历
  • 网站建设与维护实训ppt网络广告投放公司
  • 网站建设浦东安徽疫情最新情况
  • 网站建设能不能使用模板应用商店优化
  • 电子商务网站建设与运营 说课旺道seo