Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go语言闭包Closure

Go语言中闭包(Closure)基本示例与注意事项

作者:会编程的土豆

在Go语言中闭包(Closure)是一种特殊的函数,它可以捕获其创建时所在作用域中的变量,闭包通常与匿名函数一起使用,匿名函数可以访问并操作不在其参数列表中的外部变量,这篇文章主要介绍了Go语言中闭包(Closure)基本示例与注意事项的相关资料,需要的朋友可以参考下

闭包是 Go 中非常重要的概念,允许函数访问和操作其外部作用域的变量。理解闭包对于实现回调、累加器、工厂函数等场景非常有用。

一、闭包的概念

闭包是一个函数,它可以捕获并使用定义在其外部作用域的变量,即使外部函数已经返回,这些变量依然存在于内存中。

简单理解:

闭包 = 函数 + 它捕获的外部变量

二、基本示例

package main

import "fmt"

func main() {
    add := func(a, b int) int {
        return a + b
    }

    fmt.Println(add(3, 5)) // 8
}

这是最基本的函数,也可以看作闭包,但没有捕获外部变量。

三、闭包捕获外部变量

package main

import "fmt"

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

func main() {
    f := adder()
    fmt.Println(f(1)) // 1
    fmt.Println(f(2)) // 3
    fmt.Println(f(3)) // 6
}

说明:

四、闭包注意事项

func main() {
    funcs := []func(){}
    for i := 0; i < 3; i++ {
        funcs = append(funcs, func() {
            fmt.Println(i)
        })
    }
    for _, f := range funcs {
        f() // 输出 3 3 3,而不是 0 1 2
    }
}

原因:

解决办法:

for i := 0; i < 3; i++ {
    x := i
    funcs = append(funcs, func() {
        fmt.Println(x)
    })
}

输出:

0
1
2
func callback(f func(int) int) {
    fmt.Println(f(10))
}

func main() {
    y := 5
    callback(func(x int) int {
        return x + y
    }) // 输出 15
}

闭包可以捕获外部变量 y。

五、闭包总结

到此这篇关于Go语言中闭包(Closure)基本示例与注意事项的文章就介绍到这了,更多相关Go语言闭包Closure内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文