Go 语言匿名函数详解

Go 语言匿名函数详解

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


一、匿名函数定义与调用

最简单的匿名函数:

packagemainimport"fmt"funcmain(){// 定义并立即调用匿名函数func(){fmt.Println("Hello, Go!")}()// 定义匿名函数并赋值给变量f:=func(a,bint)int{returna+b}fmt.Println(f(3,5))// 输出 8}

说明:

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

二、匿名函数作为闭包

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

funcmain(){sum:=0add:=func(xint)int{sum+=xreturnsum}fmt.Println(add(1))// 1fmt.Println(add(2))// 3fmt.Println(add(3))// 6}

说明:

  • add是匿名函数,捕获了外部的sum变量。
  • 每次调用add,闭包内的sum状态会被保留。

三、匿名函数作为参数

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

funccallback(ffunc(int)int){fmt.Println(f(10))}funcmain(){y:=5callback(func(xint)int{returnx+y})// 输出 15}

说明:

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

四、匿名函数作为返回值

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

funcadder()func(int)int{sum:=0returnfunc(xint)int{sum+=xreturnsum}}funcmain(){f:=adder()fmt.Println(f(1))// 1fmt.Println(f(2))// 3fmt.Println(f(3))// 6}

说明:

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

五、匿名函数的应用场景

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

六、总结

  • 匿名函数就是没有名字的函数,可以赋值给变量、传递和返回。
  • 匿名函数捕获外部变量就形成闭包,状态可以被保留。
  • Go 语言中,匿名函数和闭包是函数式编程和高阶函数的核心工具。