[Golang 修仙之路] Go基础:Go有泛型吗?

29 阅读1分钟

有的 ✅。

Go 语言在 Go 1.18 (2022 年 3 月发布) 正式引入了 泛型(Generics)


1. 泛型是什么

泛型就是在定义函数、结构体或接口时,可以用 类型参数(type parameter) ,让代码能支持多种类型,而不必写重复逻辑。

在 Go 里,泛型主要用在:

  • 函数:写一个函数,支持多种参数类型。
  • 类型(结构体) :定义一个可以存不同类型元素的容器。

2. 泛型函数示例

package main

import "fmt"

// 泛型函数:比较两个值是否相等
func Equal[T comparable](a, b T) bool {
    return a == b
}

func main() {
    fmt.Println(Equal[int](1, 1))       // true
    fmt.Println(Equal[string]("go", "go")) // true
    // fmt.Println(Equal[[]int]([]int{1}, []int{1})) // 报错:slice 不支持 comparable
}

解释:

  • T类型参数
  • [T comparable] 表示 T 必须是可比较的类型(int、string 等)。

3. 泛型结构体示例

// 泛型结构体:栈
type Stack[T any] struct {
    data []T
}

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

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

func main() {
    s1 := Stack[int]{}
    s1.Push(10)
    s1.Push(20)
    fmt.Println(s1.Pop()) // 20

    s2 := Stack[string]{}
    s2.Push("hello")
    fmt.Println(s2.Pop()) // hello
}

4. 类型约束(Constraints)

Go 泛型支持用 接口 来约束类型:

// 约束:只能是整数
type Integer interface {
    ~int | ~int32 | ~int64
}

func Add[T Integer](a, b T) T {
    return a + b
}

这样就能保证泛型函数不会被用在不支持 + 的类型上。