Golang中闭包的理解

Golang中闭包的理解

2018年08月24日 12:07:53 Erick_Lv 阅读数:171 标签: Golang闭包闭包 更多

个人分类: Go语言笔记

版权声明:所有的博客都是博主的个人笔记。。。。。 https://blog.csdn.net/qq_35976351/article/details/81986496

简介

参考博客: 
https://www.calhoun.io/what-is-a-closure/ 
https://blog.cloudflare.com/a-go-gotcha-when-closures-and-goroutines-collide/

Golang的闭包

函数在Golang中是“一等公民”,因此关于函数的特性必须要掌握号,闭包可以看成函数的告诫应用,是Golang高级开发的必备技能。

匿名函数

“一等公民”意味着函数可以像普通的类型(整型、字符串等)一样进行赋值、作为函数的参数传递、作为函数的返回值等。Golang的函数只能返回匿名函数! 
代码实例:

var f = func(int) {}

func main() {
    f = func(i int) {
        fmt.Println(i)
    }
    f(2)
    f = func(i int) {
        fmt.Println(i * i * i)
    }
    f(2)
}
/*
输出:
2
8
*/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

上述代码中,f可以被任何输入一个整型,无返回值的函数给赋值,这类似于C++中的函数指针。因此f可以看成是一个函数类型的变量。这样,可以动态的改变f的功能。匿名函数可以动态的创建,与之成对比的常规函数必须在包中编译前就定义完毕。匿名函数可以随时改变功能。

闭包

闭包是匿名函数与匿名函数所引用环境的组合。匿名函数有动态创建的特性,该特性使得匿名函数不用通过参数传递的方式,就可以直接引用外部的变量。这就类似于常规函数直接使用全局变量一样,个人理解为:匿名函数和它引用的变量以及环境,类似常规函数引用全局变量处于一个包的环境。

func main() {
    n := 0
    f := func() int {
        n += 1
        return n
    }
    fmt.Println(f())  // 别忘记括号,不加括号相当于地址
    fmt.Println(f())
}
/*
输出:
1
2
*/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在上述代码中,

n := 0
f := func() int {
    n += 1
    return n
}
  • 1
  • 2
  • 3
  • 4
  • 5

就是一个闭包,类比于常规函数+全局变量+包。f不仅仅是存储了一个函数的返回值,它同时存储了一个闭包的状态。

闭包作为函数返回值

匿名函数作为返回值,不如理解理解为闭包作为函数的返回值,如下代码:

func Increase() func() int {
    n := 0
    return func() int {
        n++
        return n
    }
}

func main() {
    in := Increase()
    fmt.Println(in())
    fmt.Println(in())
}
/*
输出:
1
2
*/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

闭包被返回赋予一个同类型的变量时,同时赋值的是整个闭包的状态,该状态会一直存在外部被赋值的变量in中,直到in被销毁,整个闭包也被销毁

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值