Golang闭包

Golang闭包,第1张

概述1 形式含义     所谓闭包就是一个函数“捕获”了和它在同一作用于的其他常量和变量。     从形式上看,在Golang中,所有的匿名函数都是闭包。闭包的创建方式和普通函数几乎一致,只有一个关键区别:闭包没有名字。     我们来看两个例子 addPng := func(name string) string { return name + ".png" }addJpg := func(nam

1 形式含义

所谓闭包就是一个函数“捕获”了和它在同一作用于的其他常量和变量。

从形式上看,在Golang中,所有的匿名函数都是闭包。闭包的创建方式和普通函数几乎一致,只有一个关键区别:闭包没有名字。

我们来看两个例子

addpng:=func(namestring)string{returnname+".png"}addJpg:=func(namestring)string{returnname+".jpg"}filename:="abc"fmt.Println(addpng(filename),addJpg(filename))

结果如下

650) this.width=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="1.png" alt="wKioL1YfWKXxKfnzAABdlluUiKs571.jpg" src="http://s3.51cto.com/wyfs02/M01/74/7F/wKioL1YfWKXxKfnzAABdlluUiKs571.jpg">

//工厂函数,返回值也是一个函数funcaddSuffix(suffixstring)func(string)string{returnfunc(namestring)string{if!strings.HasSuffix(name,suffix){name=name+suffix}returnname}}…funcmain(){…addZip:=addSuffix(".zip")addTgz:=addSuffix(".tar.gz")fmt.Println(addZip(filename),addTgz(filename))}

650) this.width=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="2.png" alt="wKiom1YfWLfSefPmAABr7vP0oT4056.jpg" src="http://s3.51cto.com/wyfs02/M02/74/83/wKiom1YfWLfSefPmAABr7vP0oT4056.jpg">

2 实质含义

仅仅从形式上将闭包简单理解为匿名函数是不够的,还需要理解闭包实质上的含义。

实质上看,闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。由闭包的实质含义,我们可以推论:闭包获取捕获变量相当于引用传递,而非值传递;对于闭包函数捕获的常量和变量,无论闭包何时何处被调用,闭包都可以使用这些常量和变量,而不用关心它们表面上的作用域。

我们用一个例子来进行验证。

funcaddNumber(xint)func(int){fmt.Printf("x:%d,addrofx:%p\n",x,&x)returnfunc(yint){k:=x+yx=ky=kfmt.Printf("x:%d,&x)fmt.Printf("y:%d,addrofy:%p\n",y,&y)}}funcmain(){addNum:=addNumber(5)addNum(1)addNum(1)addNum(1)fmt.Println("---------------------")addNum1:=addNumber(5)addNum1(1)addNum1(1)addNum1(1)}

运行结果

650) this.width=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="3.png" alt="wKioL1YfWpyhwQw6AAGAfOsAGpQ888.jpg" src="http://s3.51cto.com/wyfs02/M01/74/7F/wKioL1YfWpyhwQw6AAGAfOsAGpQ888.jpg">

首先强调一点,x是闭包中被捕获的变量,y只是闭包内部的局部变量,而非被捕获的变量。因此,对于每一次引用,x的地址都是固定的,是同一个引用变量;y的地址则是变化的。另外,闭包被引用了两次,由此产生了两个闭包实例,即addNum := addNumber(5)addNum1 :=addNumber(5)是两个不同实例,其中引用的两个x变量也来自两个不同的实例。

总结

以上是内存溢出为你收集整理的Golang闭包全部内容,希望文章能够帮你解决Golang闭包所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1286537.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-09
下一篇2022-06-09

发表评论

登录后才能评论

评论列表(0条)

    保存