0
点赞
收藏
分享

微信扫一扫

GO+ 闭包(Closure)



闭包(Closure)

  • ​​一、GO+ 概述​​
  • ​​二、什么是闭包​​
  • ​​三、go+ 中的闭包​​

官方线上GO+练习环境:​​https://play.goplus.org/​​

一、GO+ 概述

Go+ 是一门融合工程开发的 Go、数据科学领域的 Python、编程教学领域的 Scratch,以 Python 之形结合 Go 之心,让工程师处理数据不需要学习新的开发语言,让初学者学习编程、开发作品的门槛更低的编程语言。

二、什么是闭包

什么是闭包?闭包的字面定义:闭包是由函数及其相关引用环境组合而成的

实体(即:闭包=函数+引用环境)

闭包:

现在开始通过例子来说明闭包:

func f() func() int{
var a int
return func() int{

a++
return a
}
}

调用这个函数会返回一个函数变量。

i := f():通过把这个函数变量赋值给 i,i 就成为了一个闭包。

所以 i 保存着对 a 的引用,可以想象 i 中有着一个指针指向 a 或 i 中有 a 的地址。

由于 i 有着指向 a 的指针,所以可以修改 a,且保持着状态:

运行结果:

println(i())  //  1
println(i()) // 2
println(i()) // 3

也就是说,a 逃逸了,它的生命周期没有随着它的作用域结束而结束。

但是这段代码却不会递增:

println(f())  //  1
println(f()) // 1
println(f()) // 1

这是因为这里调用了三次 f(),返回了三个闭包,这三个闭包引用着三个不同的 a,它们的状态是各自独立的。

三、go+ 中的闭包

首先看一个小例子

func f(i int) func() int{
var a int
return func() int{
i++
return i
}
}

函数 f 返回了是一个函数,f 返回的就是一个闭包。这个函数本身没有变量 i ,是从环境(函数f)中引用的。

接下来在看一段代码:

a := []int{1,2,3}
for _, i := range a{
println(i)
func(){
println(i)
}()
}

运行结果:

1
1
2
2
3
3

输出跟我们预想一样,先输出 i,再调用闭包输出。使用defer关键字再运行一次

a := []int{1,2,3}
for _, i := range a{
println(i)
defer func(){
println(i)
}()
}

GO+ 闭包(Closure)_GO+ 学习


举报

相关推荐

0 条评论