一、为什么 Go 需要泛型?
在 Go 1.18 之前,实现通用数据结构只能靠:
interface{}+ 类型断言 → 失去类型安全,运行时 panic 风险;- 代码生成(如 go generate) → 冗余、难维护。
// Go 1.17 及以前:不安全的通用栈
type Stack []interface{}
func (s *Stack) Push(v interface{}) {
*s = append(*s, v)
}
func (s *Stack) Pop() interface{} {
if len(*s) == 0 {
panic("empty stack")
}
v := (*s)[len(*s)-1]
*s = (*s)[:len(*s)-1]
return v
}
// 使用时需类型断言,易出错
stack := Stack{}
stack.Push("hello")
v := stack.Pop().(string)// 若类型写错,运行时 panic!
泛型的引入,让 Go 在编译期就能保证类型安全,同时避免重复代码。
二、Go 泛型核心语法
1. 类型参数(Type Parameters)
在函数或类型定义中使用方括号 [] 声明类型参数:
// 函数泛型
func Max[T comparable](a, b T) T {
if a > b {
return a
}
return b
}
// 类型泛型
type Stack[T any] struct {
data []T
}

