泛型类型
定义
语法格式
type Stack[T any] struct {
items []T // 字段类型可使用类型参数
}
方法
概念
- receiver 类型参数: 给泛型类型定义方法时, receiver 必须写成
Stack[T]或*Stack[T]; - 方法类型参数限制: 方法只能使用 receiver 类型已有的类型参数, 不能在方法名后新增
[U any];
语法格式
// Stack 是泛型类型, 所以方法 receiver 也要写出类型参数 T
func (s *Stack[T]) Push(v T) {
s.items = append(s.items, v)
}
func (s *Stack[T]) Pop() (T, bool) {
var zero T // 获取类型参数 T 的零值
if len(s.items) == 0 {
return zero, false
}
last := len(s.items) - 1
v := s.items[last]
s.items = s.items[:last]
return v, true
}
// func (s *Stack[T]) Convert[U any]() U { return *new(U) } // 报错, 方法不能新增自己的类型参数 U
使用
语法格式
func main() {
var s Stack[int] // 用 int 实例化泛型类型
s.Push(10)
v, ok := s.Pop()
println(v, ok)
}
递归引用
概念
- 泛型类型递归: 类型声明内部可引用自身的实例化形式;
- 类型实参: 递归引用时需要提供类型参数;
- 使用场景: 链表、树、图等递归数据结构;
语法格式
type Node[T any] struct {
Value T
Next *Node[T] // 递归引用同一类型实参的 Node
}