函数式编程是一种编程范式,它强调函数的作为一等公民,可以作为变量、类型、参数、返回值等使用。函数式编程的优点是无状态、无副作用、并发友好、抽象程度高等。

Go 语言虽然不是一门纯粹的函数式编程语言,但它提供了许多支持函数式编程风格的特性。比如高阶函数、匿名函数、闭包等。

高阶函数

高阶函数是将函数作为参数或返回值的函数。在 Go 中,函数可以作为一等公民,可以像普通值一样传递和操作

// 高阶函数,接收一个函数作为参数
func applyFunc(f func(int) int, x int) int {
    return f(x)
}

func double(x int) int {
    return 2 * x
}

func main() {
    result := applyFunc(double, 5)
    fmt.Println(result) // 输出: 10
}

匿名函数

匿名函数是没有名字的函数,可以在需要的地方直接定义和使用。

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

    result := add(3, 5)
    fmt.Println(result) // 输出: 8
}

闭包

闭包是一个可以引用其作用域之外变量的函数。 闭包的特点是可以保留外部变量的状态,也就是说,闭包函数每次调用时,都可以访问和修改上一次调用时的变量值。 闭包的实现依赖于匿名函数和引用环境。

在 Go 语言中,创建一个闭包的一般步骤是:

  • 定义一个函数,该函数返回一个匿名函数。
  • 在该函数内部,定义一个或多个变量,这些变量会被匿名函数引用。
  • 在该函数内部,返回一个匿名函数,该匿名函数可以使用外部定义的变量。
// 定义一个函数,返回一个闭包
func counter() func() int {
  // 定义一个局部变量,作为计数器
  count := 0
  // 返回一个匿名函数,该函数可以访问和修改 count 变量
  return func() int {
    // 每次调用时,计数器加一
    count++
    // 返回计数器的当前值
    return count
}

func main() {
  c := counter()
  // 调用闭包,打印结果
  fmt.Println(c()) // 1
  fmt.Println(c()) // 2
  fmt.Println(c()) // 3
}