golang泛型

Viewed 15

golang泛型

1 Answers

在Go语言中,泛型(Generics)是在Go 1.18版本中引入的一个新特性。泛型允许你编写可以处理多种数据类型的代码,而不需要在每种数据类型上重复编写相同的逻辑。这使得代码更加简洁和易于维护。

以下是一些关于Go语言泛型的基本概念和示例:

泛型函数

你可以定义一个泛型函数,使其能够处理多种数据类型。例如:

package main

import "fmt"

// 定义一个泛型函数,使用类型参数 T
func Print[T any](s []T) {
    for _, v := range s {
        fmt.Println(v)
    }
}

func main() {
    Print([]string{"Hello", "World"})
    Print([]int{1, 2, 3})
}

在这个例子中,Print函数可以处理任何类型的切片。

泛型类型

你也可以定义泛型类型。例如:

package main

import "fmt"

// 定义一个泛型类型 Stack
type Stack[T any] []T

// 定义泛型类型的方法
func (s *Stack[T]) Push(v T) {
    *s = append(*s, v)
}

func (s *Stack[T]) Pop() T {
    if len(*s) == 0 {
        panic("stack is empty")
    }
    v := (*s)[len(*s)-1]
    *s = (*s)[:len(*s)-1]
    return v
}

func main() {
    var s Stack[int]
    s.Push(10)
    s.Push(20)
    fmt.Println(s.Pop()) // 输出 20
    fmt.Println(s.Pop()) // 输出 10
}

在这个例子中,Stack类型可以处理任何类型的元素。

类型约束

你可以使用类型约束来限制泛型参数的类型。例如:

package main

import "fmt"

// 定义一个类型约束
type Number interface {
    int | float64
}

// 定义一个泛型函数,使用类型约束
func Sum[T Number](s []T) T {
    var sum T
    for _, v := range s {
        sum += v
    }
    return sum
}

func main() {
    fmt.Println(Sum([]int{1, 2, 3}))       // 输出 6
    fmt.Println(Sum([]float64{1.5, 2.5}))  // 输出 4.0
}

在这个例子中,Sum函数只能处理intfloat64类型的切片。

总结

Go语言的泛型特性为开发者提供了更强大的工具来编写可重用和类型安全的代码。通过使用泛型函数、泛型类型和类型约束,你可以编写更加灵活和高效的代码。

桂ICP备18011783号-1