16.5 匿名函数

函数值字面量是一种表达式,它的值被称为匿名函数。

从形式上看当我们不给函数起名字的时候,可以使用匿名函数,例如:

func(x, y int) int { return x + y }

这样的函数不能够独立存在,但可以被赋值于某个变量,即保存函数的地址到变量中:

fplus := func(x, y int) int { return x + y }

然后通过变量名对函数进行调用:

fplus(3, 4)

当然,也可以直接对匿名函数进行调用,注意匿名函数的最后面加上了括号并填入了参数值,如果没有参数,也需要加上空括号,代表直接调用:

func(x, y int) int { return x + y } (3, 4)

下面是一个计算从 1 到 1 百万整数的总和的匿名函数

func() {
    sum := 0
    for i := 1; i <= 1e6; i++ {
        sum += i
    }
}()

参数列表的第一对括号必须紧挨着关键字 func,因为匿名函数没有名称。花括号 {} 涵盖着函数体,最后的一对括号表示对该匿名函数的调用。下面代码演示了上面的几种情况:

package main
import (
	"fmt"
)
func main() {
	fn := func() {
		fmt.Println("hello")
	}
	fn()
	fmt.Println("匿名函数加法求和:", func(x, y int) int { return x + y }(3, 4))
	func() {
		sum := 0
		for i := 1; i <= 1e6; i++ {
			sum += i
		}
		fmt.Println("匿名函数加法循环求和:", sum)
	}()
}
程序输出:
hello
匿名函数加法求和: 7
匿名函数加法循环求和: 500000500000
下一节:匿名函数同样也被称之为闭包。