Go 语言匿名函数详解

匿名函数是没有名字的函数,可以像普通变量一样赋值、传参和调用。在 Go 中,匿名函数和闭包密切相关,是函数式编程的重要手段。


一、匿名函数定义与调用

最简单的匿名函数:

go 复制代码
package main

import "fmt"

func main() {
    // 定义并立即调用匿名函数
    func() {
        fmt.Println("Hello, Go!")
    }()

    // 定义匿名函数并赋值给变量
    f := func(a, b int) int {
        return a + b
    }

    fmt.Println(f(3, 5)) // 输出 8
}

说明:

  • 匿名函数可以立即执行,也可以赋值给变量后多次调用。
  • 匿名函数的类型由其参数和返回值确定,可以像普通函数一样传递和返回。

二、匿名函数作为闭包

匿名函数可以捕获外部变量,从而形成闭包:

go 复制代码
func main() {
    sum := 0
    add := 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 变量。
  • 每次调用 add,闭包内的 sum 状态会被保留。

三、匿名函数作为参数

匿名函数常用于回调或高阶函数:

go 复制代码
func callback(f func(int) int) {
    fmt.Println(f(10))
}

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

说明:

  • 匿名函数直接作为 callback 参数传入。
  • 可以访问外部作用域变量 y。

四、匿名函数作为返回值

匿名函数可以返回给调用方,常用于函数工厂或生成累加器:

go 复制代码
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
}

说明:

  • adder 返回一个匿名函数。
  • 返回的函数可以保留和操作外部变量 sum,形成闭包。

五、匿名函数的应用场景

  1. 临时函数:只使用一次,不需要命名。
  2. 闭包:累加器、延迟计算、状态保持。
  3. 回调函数:事件处理、排序、过滤。
  4. 工厂函数:返回自定义功能函数。

六、总结

  • 匿名函数就是没有名字的函数,可以赋值给变量、传递和返回。
  • 匿名函数捕获外部变量就形成闭包,状态可以被保留。
  • Go 语言中,匿名函数和闭包是函数式编程和高阶函数的核心工具。
相关推荐
David猪大卫5 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger5 小时前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
努力努力再努力wz8 小时前
【Lua 进阶系列】从 C++ 对象到 Lua 变量:一文理解 userdata、Lua 栈与元表绑定机制
c++·junit·lua
慧都产品智能化8 小时前
Qt 表格升级攻略:复用已有编辑器,减少重复开发
c++·qt·编辑器·qt6.3
ShineWinsu9 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu10 小时前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
坤坤子吖10 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
沫璃染墨11 小时前
从零入门计算机网络系列(十八):TCP连接管理详解——从三次握手与四次挥手到TIME_WAIT机制
运维·服务器·网络·c++·网络协议·tcp/ip·tcp
自信1504130575913 小时前
重生之从0开始学习c++之——vector-中篇
c++·学习·算法
ShineWinsu16 小时前
对于Qt:QDial常见属性以及信号的解析
开发语言·c++·qt·gui·客户端·旋钮·qdial