Go 1.18 引入泛型,通过类型参数与类型约束实现代码复用,同时保持编译期类型安全。
一、类型约束定义
go
type Number interface {
~int | ~int64 | ~float64
}
func Sum[T Number](values []T) T {
var total T
for _, v := range values {
total += v
}
return total
}~ 表示底层类型匹配,允许自定义类型(如 type MyInt int)也满足约束。
二、泛型数据结构
go
type Stack[T any] struct {
items []T
}
func (s *Stack[T]) Push(v T) {
s.items = append(s.items, v)
}
func (s *Stack[T]) Pop() (T, bool) {
var zero T
if len(s.items) == 0 {
return zero, false
}
v := s.items[len(s.items)-1]
s.items = s.items[:len(s.items)-1]
return v, true
}泛型适合容器、算法与工具函数,但不应滥用;接口仍是对行为抽象的首选。