1. 匿名函数

1.1.1. 匿名函数

匿名函数是指不需要定义函数名的一种函数实现方式。1958年LISP首先采用匿名函数。

在Go里面,函数可以像普通变量一样被传递或使用,Go语言支持随时在代码里定义匿名函数。

匿名函数由一个不带函数名的函数声明和函数体组成。匿名函数的优越性在于可以直接使用函数内的变量,不必申明。

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. func main() {
  7. getSqrt := func(a float64) float64 {
  8. return math.Sqrt(a)
  9. }
  10. fmt.Println(getSqrt(4))
  11. }

输出结果:

  1. 2

上面先定义了一个名为getSqrt 的变量,初始化该变量时和之前的变量初始化有些不同,使用了func,func是定义函数的,可是这个函数和上面说的函数最大不同就是没有函数名,也就是匿名函数。这里将一个函数当做一个变量一样的操作。

Golang匿名函数可赋值给变量,做为结构字段,或者在 channel 里传送。

  1. package main
  2. func main() {
  3. // --- function variable ---
  4. fn := func() { println("Hello, World!") }
  5. fn()
  6. // --- function collection ---
  7. fns := [](func(x int) int){
  8. func(x int) int { return x + 1 },
  9. func(x int) int { return x + 2 },
  10. }
  11. println(fns[0](100))
  12. // --- function as field ---
  13. d := struct {
  14. fn func() string
  15. }{
  16. fn: func() string { return "Hello, World!" },
  17. }
  18. println(d.fn())
  19. // --- channel of function ---
  20. fc := make(chan func() string, 2)
  21. fc <- func() string { return "Hello, World!" }
  22. println((<-fc)())
  23. }

输出结果:

  1. Hello, World!
  2. 101
  3. Hello, World!
  4. Hello, World!