当前位置: 代码迷 >> 综合 >> golang 中的闭包是什么
  详细解决方案

golang 中的闭包是什么

热度:42   发布时间:2023-10-19 13:03:48.0

目录

  • 从匿名函数说起
  • 函数返回值为函数
  • golang 中的闭包是什么
  • 总结
  • 参考

从匿名函数说起

我们先来看看一个常规的有名字的函数是什么样子的,就像下面这样

func myFunc(value string) {
    fmt.Println(value)
}

你可以通过下面的方式调用它

myFunc("我是张三") // 我是张三

现在我们用匿名函数来书写上面的内容

func main() {
    func(value string) {
    fmt.Println(value)}("我是张三") // 我是张三
}

在这里有两个要注意的地方:
第一个,匿名函数不能单独使用,也就是说,你不能像开始的 myFunc 一样在外部新建一个函数,匿名函数必须搭配一个有名函数使用,这种搭配是指匿名函数在有名的函数体内,就像上面的匿名函数是在 main 内部。

第二个,上面的匿名函数在函数体内,必须采用“立即执行”的方式,原因是,go 中函数也是一种变量,因为匿名函数在函数体内,所以它更是一种局部变量,而 go 中局部变量声明了就必须使用,所以要采用立即执行的方式,即后面 ("我是张三")的部分。

函数返回值为函数

匿名函数最常用的适用场景就是作为函数的返回值,这在 go 中是允许的。我们来看下面的代码:

func return_func() func(string) {
    return func(value string){
    fmt.Println(value)}
}

return_func 这个函数返回了一个匿名函数,就是这一大块

func(string) {
    return func(value string){
    fmt.Println(value)}
}

对于 return_func 你可以这样调用

package mainimport ("fmt"
)func return_func() func(string) {
    return func(value string) {
    fmt.Println(value)}
}func main() {
    getReturn := return_func() // getReturn 将会获取 return_func 返回的那一大块函数getReturn("我是李四") // 我是李四
}

以上便是匿名函数的用法。

golang 中的闭包是什么

闭包就是指一个函数引用了定义在自身函数体之外的变量,这使得采用闭包的函数有点像内部函数,但是使用了闭包的函数可以在它所引用的函数生命周期结束后,依然可以使用该引用函数的变量。

下面我们就来看代码理解一下。我们重新书写一个函数 return_int

func return_int() func() int{
    val := 0return func(){
    val++return val}
}

这个 return_int 和之前的 return_func 本质上没有什么区别,下面我们来执行一下

package mainimport ("fmt"
)func return_int() func() int {
    val := 0return func() int {
    val++return val}
}func main() {
    getReturn := return_int()fmt.Println(getReturn()) // 1fmt.Println(getReturn()) // 2fmt.Println(getReturn()) // 3
}

可以看到,return_int 在赋值给 getReturn 后就已经结束了,然后在执行 getReturn 时(getReturn 就是那一块匿名函数作为返回值的部分),依然可以使用 val,要知道 val 是 return_int 的变量,由此可见,闭包延长了使用的外部函数变量的寿命。
golang 中的闭包是什么

总结

  1. 匿名函数就是一个没有名字的函数,常用于函数返回值的情况
  2. 闭包就是一个函数引用自身函数体之外的另一个函数中的变量

参考

  1. Writing Web Applications