跳到主要内容

泛型类型

定义

语法格式

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
}