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 语言中,匿名函数和闭包是函数式编程和高阶函数的核心工具。
相关推荐
会编程的土豆1 小时前
Go 语言闭包(Closure)详解
c++·golang·xcode
右耳朵猫AI1 小时前
Golang技术周刊 2026年第20周
开发语言·后端·golang
不吃土豆的马铃薯1 小时前
高性能服务器程序框架详解(包括Reactor,有限状态机等)
linux·服务器·开发语言·网络·c++
会编程的土豆1 小时前
Redis 常用操作笔记(Go 开发实战)
redis·笔记·golang
郝学胜-神的一滴1 小时前
Qt 高级开发 020:水平布局手写代码实战
开发语言·c++·qt·系统架构·软件构建·用户界面
小欣加油1 小时前
leetcode2126 摧毁小行星
数据结构·c++·算法·leetcode·职场和发展
BestOrNothing_20151 小时前
C++零基础到工程实战(5.2.6):函数与数组和数组引用
c++·数组·函数·数组引用·返回数组·参数数组
Mortalbreeze1 小时前
C++11 ---- 右值引用、值类型
开发语言·c++
少司府1 小时前
C++进阶:多态
c语言·开发语言·c++·多态·抽象类·虚函数·虚表指针