golang 匿名函数和闭包

关于匿名函数和闭包的讲解参考:

https://www.bilibili.com/video/BV1bN4y1Z7BT?p=67&vd_source=ea52820e782c8a50f320e5a767b5f2d7

匿名函数

如果一个函数因为只调用一次,所以不需要另外func 定义函数,所以使用匿名函数。

在 Go 语言中,匿名函数是一种没有函数名的函数,通常在定义它们的同时就直接使用它们。匿名函数可以作为值传递给其他函数,或者直接被调用。它们在需要一个短小的功能代码块时非常有用。

以下是匿名函数的基本语法:

func() {
    // 函数体
}()

这是一个简单的匿名函数示例:

package main

import "fmt"

func main() {
    // 定义并立即调用一个匿名函数
    func() {
        fmt.Println("This is an anonymous function.")
    }()
}

在这个示例中,我们定义了一个没有名称的函数,并立即在 main() 函数中调用它。该匿名函数打印一条消息 "This is an anonymous function." 到标准输出。

匿名函数也可以带有参数和返回值,就像普通函数一样。以下是一个带有参数和返回值的匿名函数示例:

package main

import "fmt"

func main() {
    // 定义并调用带有参数和返回值的匿名函数
    result := func(a, b int) int {
        return a + b
    }(10, 20)

    fmt.Println("Result:", result)
}

在这个示例中,我们定义了一个匿名函数,它接受两个整数参数并返回它们的和。然后,我们在定义时就传入了参数 10 和 20,并将匿名函数的返回值赋给 result 变量。最后,我们打印 result 变量的值。

匿名函数可以在需要的地方动态地定义和使用,尤其在需要将函数作为参数传递给其他函数或需要局部定义一些逻辑时非常方便。


闭包:

闭包是指一个函数捕获并绑定了其周围的引用环境中的变量的函数。换句话说,闭包是一个函数值,它引用了函数体之外的变量。在 Go 中,匿名函数常常是闭包的一个实现。

示例:

package main

import "fmt"

func main() {
    // 闭包函数
    add := func() func(int) int {
        sum := 0
        return func(x int) int {
            sum += x
            return sum
        }
    }()

    fmt.Println(add(1)) // 输出 1
    fmt.Println(add(2)) // 输出 3
    fmt.Println(add(3)) // 输出 6
}

在这个示例中,我们定义了一个闭包函数 add,它返回一个函数,该函数接受一个整数参数并返回一个整数。闭包内部有一个局部变量 sum,它被内部函数捕获,使得每次调用内部函数时都能访问并修改 sum 变量。因此,每次调用 add 返回的函数时,sum 的值会被保留并累加。

特点解释:

  1. 捕获外部变量: 闭包函数可以捕获和访问其外部作用域中的变量,即使外部作用域已经退出,闭包仍然可以访问和修改这些变量。

  2. 延长变量生命周期: 由于闭包函数捕获了外部变量的引用,使得这些变量的生命周期得以延长,直到闭包不再被引用。

  3. 封装和状态保持: 闭包函数常常用于封装一些私有的状态,并保持其在多次调用之间的状态。这使得闭包函数可以作为一种状态机或迭代器使用。

  4. 灵活性和简洁性: 闭包函数使得代码更具灵活性和简洁性,可以在需要时直接定义并使用,避免了为简单功能单独定义函数的麻烦。

  5. 并发安全: 闭包函数内部的变量只能被该闭包函数访问和修改,因此可以避免并发访问的竞态条件,从而实现并发安全。

闭包是 Go 中非常强大和灵活的特性,可以用来实现许多有趣的编程模式和技术。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值