章节索引 :

本文主要介绍 Go 语言的另一大编程特性——函数式编程。函数式编程的基础特点为:

  • 函数是一等公民,即函数可以做为变量
  • 纯函数,即函数内的操作不可影响到函数外。

Go 语言的函数式编程无需遵循第二点,这一特性为 Go 语言的函数式编程带来了更大的灵活性。

1. 编程示例

接下来我们来分别展示用函数式编程和普通编程方式来实现一个累加器,即输出 1+2+3+…+100 的值。

普通方式实现:

func main() {
    a := 0
    for i := 1; i <= 100; i++ {
        a = a + i
    }
    fmt.Println(a)
}

函数式编程实现:

package main

import (
    "fmt"
)

type iAdder func(int) int

func adder() iAdder {
    sum := 0
    return func(v int) int {
        sum += v
        return sum
    }
}

func main() {
    a := adder()
    var s int
    for i := 1; i <= 100; i++ {
        s = a(i)
    }
    fmt.Println(s)
}
  • 第 7 行:定义函数类型自定义数据类型;
  • 第 9~15 行:定义累加器函数;
  • 第 18 行:定义变量 a,并将累加器函数作为值赋给变量 a;
  • 第 20~22 行:累加 100 次。

执行结果:

image.png

两者比较,就是后者将整个累加过程作为变量放置在了循环以外,使得整个累加可以脱离循环之外。看起来就像是不断的对一个传入的常数进行加工,就像是流水线的一个工具。所以函数式编程在开发过程中经常会用在对数据的长流程处理。例如,录入身份证号时,要从身份证号中获取年龄,籍贯、性别等信息,就可以使用三个函数对身份证号进行顺序处理。这样写的好处就在于可以随时增删其流程

2. 小结

Go语言的函数式编程比起传统函数式编程更加灵活,主要在于不需要遵循纯函数原则。Go语言的函数式编程主要应用在类似于流水线加工数据的场景,以便于随时增删数据处理流程