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() 函数以参数的形式:
- 一个片断的
any类型T - 的初始值
any类型的初始值M,这是我们的累加器的起始值--累加还原器函数调用的部分结果的值。请注意,累加器的类型不需要和片断的类型相同。 - 一个reducer函数,它接收累积器和分片的当前值,并返回新的累积器。
因此,我们创建了一个与其他语言中已知的reduce() 工作类似的函数。在main() 的第一个例子中,它被用来对一个片断的数字进行求和,在第二个例子中,对同一个片断进行求和,其中每个值被除以10,结果是float64 而不是int 。