跳转到主要内容

在本教程中,我们将研究 Go 中的闭包。我们将介绍它们背后的理论,并研究如何在自己的 Go 应用程序中使用它们。

闭包 - 理论


所以,让我们深入理论。

我们可以在任何支持函数作为一等对象的编程语言中创建和使用闭包。 Go,恰好是这样一种语言,否则这篇文章将毫无意义。

因此,闭包的技术定义是闭包是一种使用具有一流功能的语言实现词法范围名称绑定的技术 - 维基百科。

现在,别担心,当我第一次读到这篇文章时,我有点挠头,不得不考虑一下。

用外行的话来说,闭包是一个函数值,它能够引用与它的主体一起布置的变量。

注意 - 重要的是要注意闭包和匿名函数之间的明显区别,这些区别通常被误认为是闭包。您可以在此处了解有关匿名函数的更多信息:Go Anonymous Functions

一个简单的例子


让我们创建一个非常简单的闭包示例,希望能阐明它是如何工作的。

我们将从创建一个名为 getLimit() 的非常简单的函数开始,这将是本例中的闭包。

这将包含一个 int 类型的限制变量,该变量将设置为 10。每次调用 limit()

main.go

package main

import "fmt"

func getLimit() func() int {
    limit := 10
    return func() int {
        limit -= 1
        return limit
    }
}

func main() {
    limit := getLimit()
    fmt.Println(limit())
    fmt.Println(limit())
}

现在,如果我们运行它,我们应该会看到以下输出:

$ go run main.go

9
8


但为什么这很重要?好吧,这个限制变量绑定到它分配的限制。如果我们将 getLimit() 绑定到它下面的 limit2 ,它将有一个独特的状态:

main.go

package main

import "fmt"

func getLimit() func() int {
    limit := 10
    return func() int {
        limit -= 1
        return limit
    }
}

func main() {
    limit := getLimit()
    fmt.Println(limit()) // 9
    fmt.Println(limit()) // 8

    limit2 := getLimit()
    fmt.Println(limit2()) // 9
    fmt.Println(limit2()) // 8

    fmt.Println(limit()) // 7

}

当我们运行它时,我们应该看到以下输出:

$ go run main.go

9
8
9
8
7


太棒了,所以我们刚刚成功地在 Go 中创建了自己的闭包实例。

结论


因此,在本教程中,我们介绍了闭包的基本理论以及如何在自己的 Go 程序中使用它们。

希望您发现本教程很有用,如果您这样做了,或者如果您有任何反馈/建议,我很乐意在下面的评论/建议部分听到它们!

文章链接