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 语言中,匿名函数和闭包是函数式编程和高阶函数的核心工具。
相关推荐
远离UE45 小时前
UE5 compute shader 原子加
开发语言·c++·ue5
C+-C资深大佬5 小时前
C++ 显式类型转换详解:static_cast、dynamic_cast、const_cast、reinterpret_cast
开发语言·c++
luj_17686 小时前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
取地址符6 小时前
C++学习笔记(基于learn-cxx)(1)
c++·经验分享·笔记·学习
思麟呀7 小时前
C++17(三)if constexpr+折叠表达式
开发语言·c++
ysa0510307 小时前
【板子】ST表
c++·笔记·算法·板子
CHHH_HHH8 小时前
【C++11】深入解析C++可变参数模板
开发语言·c++·算法·stl·c++11
十五年专注C++开发8 小时前
fatal error C1189: #error: WinSock.h has already been included 的解决方案
c++·socket·boost
旖-旎11 小时前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划
qeen8712 小时前
〖C++〗STL简介:发展历史、六大组件与简单应用
c++·学习·stl·模板