go闭包

作者: GGBond_8488 | 来源:发表于2020-02-27 20:08 被阅读0次

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
········

相关文章

  • 第02天(函数、工程管理)_03

    11_函数类型.go 12_回调函数.go 13_匿名函数和闭包.go 14_闭包捕获外部变量的特点.go 15_...

  • golang

    golang中闭包的问题 熟悉go语言的开发者都知道,go的闭包是可以记录状态的。当我想用闭包来实现保存某一str...

  • go闭包

    这里的函数接受了一个int参数,返回了一个匿名函数。在调用addn时,返回了就是一个函数,需要再次传参调用执行。其...

  • go闭包

    闭包简单的说就是一个匿名函数+外部变量的引用,举例如下 示例一 package main import ( "...

  • go 闭包

    1.闭包的概念闭包并不是什么新奇的概念,它早在高级语言开始发展的年代就产生了。闭包(Closure)是词法闭包(L...

  • go闭包

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

  • go 闭包

    基本介绍 闭包就是一个函数和与其相关的引用环境组合的一个整体(实体) 案例: 说明:1、AddUpper是一个函数...

  • go语言 闭包

  • Go之闭包

    闭包(closure): 一个外层函数中,有内层函数,该内层函数中,会操作外层函数的局部变量(外层函数中的参数,或...

  • 26. 函数闭包

    如果非必要,尽量不要在程序中使用闭包。go函数可以是一个闭包。闭包是一个函数值,它引用了函数体之外的变量。这个函数...

网友评论

      本文标题:go闭包

      本文链接:https://www.haomeiwen.com/subject/xhoxhhtx.html