go闭包

Go语言中闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放…

函数 + 引用环境 = 闭包
闭包就是函数返回一个匿名函数,而在这个函数存活的期间,该函数所引用的变量都不会消亡
同一个函数与不同引用环境组合,可以形成不同的实例,如下图所示。

闭包与函数引用

一个函数类型就像结构体一样,可以被实例化,函数本身不存储任何信息,只有与引用环境结合后形成的闭包才具有“记忆性”,函数是编译期静态的概念,而闭包是运行期动态的概念。

package main

import "fmt"

func adder() func(int) int {
    sum := 0
    return func(x int) int {
        sum += x
        return sum
    }
}

func main() {
    pos, neg := adder(), adder()
    for i := 0; i < 10; i++ {
        fmt.Println(
            pos(i),
            neg(-2*i),
        )
    }
}
0 0
1 -2
3 -6
6 -12
10 -20
15 -30
21 -42
28 -56
36 -72
45 -90

引用go官方文档中的一个例子,可以看到在pos和neg两个函数存活的周期内,他们各自所持有的sum变量是一直存活的。(这里的sum值随着每一次对应函数的调用都会增长传入的X)

0=0+0  0=0+0
1 = 0+0 -2+-2+0
3 = 1+2 -6=-2+-2*2
········
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近在看go语言中的defer,里面涉及到了闭包,之前只是对闭包有了解,但是并没有深入的研究过,这次就深入研究一下...
    链人成长chainerup阅读 14,754评论 0 8
  • 基本介绍 闭包就是一个函数和与其相关的引用环境组合的一个整体(实体) 案例: 说明:1、AddUpper是一个函数...
    StevenQin阅读 973评论 2 1
  • 先说工厂模式,工厂模式有3种:简单工厂模式;工厂方法模式;抽象工厂模式。 go语言中的闭包已经在上一节golang...
    初级赛亚人阅读 2,017评论 1 1
  • 闭包简单的说就是一个匿名函数+外部变量的引用,举例如下 示例一 package main import ( "...
    明明就_c565阅读 138评论 0 0
  • 今天,姨夫想砌一个炉子做饭。他先用粉笔在地上画好炉子的轮廓,再画上大、中、小三个放锅的地方。然后先垒了5层砖...
    是其非阅读 370评论 0 2