一、泛型的概念与优势
1.1 泛型的介绍
Go 1.18 版本引入了泛型 (Generics) 特性,这是 Go 语言自发布以来最重大的语言特性变更之一。泛型是一种允许在函数或类型定义中使用'类型变量'的编程特性,泛型允许你编写可以处理多种类型的函数和数据结构,而不需要为每种类型重复编写代码。
泛型的引入解决了 Go 语言长期以来缺乏灵活性的问题,特别是在处理集合、算法等通用场景时,显著减少了重复代码。
1.2 Go 的泛型
Go 还引入了非常多全新的概念: • 类型形参 (Type parameter) • 类型实参 (Type argument) • 类型形参列表 (Type parameter list) • 类型约束 (Type constraint) • 实例化 (Instantiations) • 泛型类型 (Generic type) • 泛型接收器 (Generic receiver) • 泛型函数 (Generic function)
1.3 泛型的使用建议
- 合理使用类型约束:在使用泛型时,尽量明确类型约束,避免滥用
any类型,以确保代码的类型安全。 - 避免过度泛化:虽然泛型可以提升代码的灵活性,但过度使用可能导致代码难以理解和维护。
- 结合接口使用:利用接口作为类型约束,可以定义更通用的泛型逻辑,例如通过
comparable或自定义接口来限制类型行为。
二、泛型的使用
2.1 泛型函数
泛型函数允许在调用时指定具体的类型参数,编译器会生成对应的实例化代码。
package main
import "fmt"
// Swap 交换两个元素的值
func Swap[T any](a, b *T) {
temp := *a
*a = *b
*b = temp
}
func main() {
i, j := 10, 20
Swap(&i, &j)
fmt.Println(i, j) // 输出:20 10
}
2.2 泛型结构体
泛型结构体可以在定义时声明类型参数,并在字段中使用。
package main
import "fmt"
type Stack[T any] struct {
items []T
}
func (s *Stack[T]) Push(item T) {
s.items = append(s.items, item)
}
func Pop() (T, ) {
(s.items) == {
zero T
zero,
}
index := (s.items) -
item := s.items[index]
s.items = s.items[:index]
item,
}
{
s Stack[]
s.Push()
s.Push()
val, ok := s.Pop()
fmt.Println(val, ok)
}

