有的 ✅。
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
}
这样就能保证泛型函数不会被用在不支持 + 的类型上。