Go 的泛型

1. 泛型的介绍

泛型是一种编程范式,它将类型参数化,可以用于编写灵活且可重用的函数或数据结构,这样我们就可以用自己的类型来代替那些被硬编码的类型。

泛型的好处是可以在编译时期发现类型不匹配的错误,而不是在运行时期。

2. Go 的泛型

Go 语言的泛型是通过类型参数化实现的,它的类型参数化的方式是通过在函数名后面加上类型参数列表实现的,例如:

func Swap[T any](x, y T) (T, T) {
    return y, x
}
TanyT

3. 泛型函数

泛型函数是指可以接受任意类型的函数,例如:

func Map[T, U any](f func(T) U, list []T) []U {
    newList := make([]U, len(list))
    for i, v := range list {
        newList[i] = f(v)
    }
    return newList
}
MapflistfTUlistTMapU

4. 泛型类型

泛型类型是指可以接受任意类型的类型,例如:

type Stack[T any] []T

func (s *Stack[T]) Push(v T) {
    *s = append(*s, v)
}

func (s *Stack[T]) Pop() T {
    v := (*s)[len(*s)-1]
    *s = (*s)[:len(*s)-1]
    return v
}
StackTPushTPopT

5. 泛型接口

泛型接口是指可以接受任意类型的接口,例如:

type Container[T any] interface {
    Put(v T)
    Get() T
}

type Stack[T any] []T

func (s *Stack[T]) Put(v T) {
    *s = append(*s, v)
}

func (s *Stack[T]) Get() T {
    v := (*s)[len(*s)-1]
    *s = (*s)[:len(*s)-1]
    return v
}
ContainerTPutTGetTStackTPutTGetT

6. 泛型结构体

泛型结构体是指可以接受任意类型的结构体,例如:

type Pair[T1, T2 any] struct {
    First  T1
    Second T2
}

func main() {
    p1 := Pair[int, string]{1, "hello"}
    p2 := Pair[int, string]{2, "world"}
    fmt.Println(p1, p2)
}
PairT1T2FirstT1SecondT2

7. 泛型约束

泛型约束是指对泛型的类型进行约束,例如:

func Max[T comparable](x, y T) T {
    if x > y {
        return x
    }
    return y
}
MaxTTT

8. 泛型函数的类型推断

泛型函数的类型推断是指在调用泛型函数时,可以根据传入的参数类型推断出泛型函数的类型,例如:

func main() {
    fmt.Println(Max(1, 2))
    fmt.Println(Max(1.1, 2.2))
    fmt.Println(Max("hello", "world"))
}
MaxTTTMaxTTMax