在Golang中使用泛型reduce函数 - gosamples


reduce()函数是由 JavaScript 和 Python 等其他编程语言推广的函数式编程概念。
它的工作原理是通过对数组中的每个元素应用一个产生部分结果的函数,将一个数组还原成一个单一的值。最后一项之后的结果是整个列表的累积值。
到目前为止,在 Go 中,创建这种适用于不同类型的函数并不容易。然而,随着引入泛型的 Go 1.18 版本,这不再是一个问题。

package main

import (
    "fmt"
)

func reduce[T, M any](s T, f func(M, T) M, initValue M) M {
    acc := initValue
    for _, v := range s {
        acc = f(acc, v)
    }
    return acc
}

func main() {
    numbers := int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    sum := reduce(numbers, func(acc, current int) int {
        return acc + current
    }, 0)
    fmt.Println(sum)
    
    divided := reduce(numbers, func(acc float64, current int) float64 {
        return acc + float64(current)/10.0
    }, 0)
    fmt.Println(divided)
}
输出:
55
5.5

让我们看一下这个例子。reduce()函数的参数是

  1. 一个any类型T的slice
  2. 一个任意类型的初始值M,它是我们的累加器的起始值--用于累加还原器函数调用的部分结果的值。请注意,累加器的类型不需要和slice的类型相同。
  3. 一个reducer函数,接收累积器和slice的当前值,并返回新的累积器。

因此,我们创建了一个与其他语言中已知的reduce()工作类似的函数。
在main()的第一个例子中,它被用来对一个slice的数字进行求和,在第二个例子中,对同一个slice进行求和,每个值被除以10,结果是float64而不是int。