在go语言中使用泛型重新定义数组之和函数代码示例

2023-06-01 00:00:00 示例 数组 之和

go语言在1.18版本之前在处理数组时是需要为不同的类型编写重复的代码,因此在go 1.18版本增加了泛型,泛型使开发者能够编写更灵活和可重用的代码。

下面深入了解Golang的泛型,探索它们如何重新定义数组的和,并通过实际的用例片段来简化你的代码。


Golang泛型介绍

泛型是一个编程概念,它允许开发人员在不重复代码的情况下编写适用于不同数据类型的函数和数据结构。

与其为每种数据类型编写单独的函数,你可以编写一个处理不同类型的函数,从而使代码更简洁、更易维护。


Golang的泛型包括两个主要部分:

类型参数: 

类型参数是实际类型的占位符。它们用方括号([])括起来,你可以用函数、类型或方法定义它们。

类型约束: 

类型约束定义了可以作为类型参数的类型参数的类型集合。它们可以用接口或一个特殊的关键字 any 来定义。


举例对比说明:

为数组之和使用泛型

在 Golang 引入泛型之前,Golang 开发者习惯于编写单独的函数来计算不同类型的数组(如 int, float64)中的元素之和。

让我们看一个例子:

func SumInts(arr []int) int {
    sum := 0
    for _, v := range arr {
        sum += v
    }
    return sum
}
func SumFloat64s(arr []float64) float64 {
    sum := 0.0
    for _, v := range arr {
        sum += v
    }
    return sum
}

但现在有了泛型,你可以写一个函数来处理多种数据类型。

下面是一个例子,你如何使用Golang泛型重写sum函数:

package main
import (
    "fmt"
)
type Adder interface {
    Add(Adder) Adder
}
type MyInt int
type MyFloat64 float64
func (a MyInt) Add(b Adder) Adder {
    return a + b.(MyInt)
}
func (a MyFloat64) Add(b Adder) Adder {
    return a + b.(MyFloat64)
}
func Sum[T Adder](arr []T) T {
    var sum T = arr[0]
    for _, v := range arr[1:] {
        sum = sum.Add(v).(T)
    }
    return sum
}
func main() {
    intArr := []MyInt{1, 2, 3, 4, 5}
    floatArr := []MyFloat64{1.1, 2.2, 3.3, 4.4, 5.5}
    fmt.Println(Sum(intArr))   // Output: 15
    fmt.Println(Sum(floatArr)) // Output: 16.5
}

在这个例子中,我们定义了Adder接口,该接口要求为它所支持的类型实现一个Add方法。

然后我们创建了两个自定义类型,MyInt和MyFloat64,它们实现了Adder接口。

为这两个类型定义了Add方法,Sum函数使用Add方法进行加法运算。

这段代码应该可以在Go 1.18或更高版本中正确编译和运行。

相关文章