Golang中的匿名函数的面试题

80 阅读2分钟
  1. 什么是匿名函数?

匿名函数是没有名称的函数,它可以直接定义在一个表达式或语句中,并在定义的同时被执行。在 Go 语言中,可以使用关键字 func 和花括号 {} 来定义匿名函数。

  1. 匿名函数有哪些用途?

匿名函数可以用于实现闭包,即在函数内部定义函数并返回它,从而保留函数的内部状态,实现类似于对象的功能。此外,匿名函数还可以用于实现延迟执行,即在函数返回前执行某些操作。

  1. 如何声明并调用一个简单的匿名函数?

可以使用如下语法声明一个简单的匿名函数:

scssCopy code
func() {
    fmt.Println("Hello, World!")
}()

该匿名函数不需要传入参数,也没有返回值,只是打印了一条 "Hello, World!" 的消息。

  1. 如何在匿名函数中使用外部变量?

可以在匿名函数中使用外部变量,这就是闭包的应用。外部变量会被保存在匿名函数的环境中,并在函数执行时被引用。例如:

scssCopy code
func main() {
    x := 1
    increment := func() {
        x++
        fmt.Println(x)
    }
    increment()  // 输出 2
    increment()  // 输出 3
}

在这个例子中,increment 是一个匿名函数,它引用了外部变量 x。每次调用 increment 都会使 x 的值增加 1,并打印出新的值。

  1. 如何将匿名函数作为参数传递给其他函数?

在 Go 语言中,可以将匿名函数作为参数传递给其他函数。例如:

goCopy code
func main() {
    nums := []int{1, 2, 3, 4, 5}
    result := filter(nums, func(n int) bool {
        return n%2 == 0
    })
    fmt.Println(result)  // 输出 [2 4]
}

func filter(nums []int, f func(int) bool) []int {
    var result []int
    for _, n := range nums {
        if f(n) {
            result = append(result, n)
        }
    }
    return result
}

在这个例子中,filter 函数接受一个整数切片和一个函数作为参数。这个函数会遍历切片中的每个元素,并调用传入的函数对其进行过滤。传入的函数是一个匿名函数,它返回一个布尔值,表示当前元素是否应该被保留。最终,filter 函数返回被保留的元素组成的切片。