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 语言中,匿名函数和闭包是函数式编程和高阶函数的核心工具。
相关推荐
我不是懒洋洋5 分钟前
从零实现一个分布式计算:MapReduce的核心设计
c++
Achou.Wang9 小时前
深入理解go语言-第5章 并发编程——Go的灵魂
大数据·算法·golang
小王C语言10 小时前
【7. 实现登录注册模块】:实现会话管理、注册/登录/退出 API
网络·c++
峥无13 小时前
C++11 深度详解:现代 C++ 基石全梳理
开发语言·c++·笔记
阿米亚波13 小时前
【C++ STL】std::unordered_multimap
开发语言·数据结构·c++·笔记·stl
名字还没想好☜13 小时前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
小王C语言13 小时前
【3. 基于 Vibe Coding 的 OJ 平台】. 构建仓库、环境准备、需求梳理、安装依赖
网络·c++
小王C语言14 小时前
【8.进行接口测试】:通过 curl 进行接口自动化测试 / 通过 python 程序进行接口自动化测试
网络·c++
ttwuai15 小时前
GoFrame 后台日志清空失败:无 WHERE 删除为什么被拦住
前端·golang
888CC++15 小时前
C++ 快速学习指南:从入门到进阶的实战路线
开发语言·c++