加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang闭包

发布时间:2020-12-16 18:38:28 所属栏目:大数据 来源:网络整理
导读:1 形式含义 所谓闭包就是一个函数“捕获”了和它在同一作用于的其他常量和变量。 从形式上看,在Golang中,所有的匿名函数都是闭包。闭包的创建方式和普通函数几乎一致,只有一个关键区别:闭包没有名字。 我们来看两个例子 addPng:=func(namestring)string{

1 形式含义

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

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

我们来看两个例子

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

结果如下

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))
}

wKiom1YfWLfSefPmAABr7vP0oT4056.jpg

2 实质含义

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

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

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

funcaddNumber(xint)func(int){
fmt.Printf("x:%d,addrofx:%pn",x,&x)
returnfunc(yint){
k:=x+y
x=k
y=k
fmt.Printf("x:%d,&x)
fmt.Printf("y:%d,addrofy:%pn",y,&y)
}
}

funcmain(){
addNum:=addNumber(5)
addNum(1)
addNum(1)
addNum(1)

fmt.Println("---------------------")

addNum1:=addNumber(5)
addNum1(1)
addNum1(1)
addNum1(1)
}

运行结果

wKioL1YfWpyhwQw6AAGAfOsAGpQ888.jpg

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读