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

banq發表於2022-03-17

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。


 

相關文章