2023-09-10 22:47:21
Go语言在1.18版本中引入了泛型(Generics),允许开发者编写可处理多种类型的函数和类型,从而提升代码的复用性和灵活性。以下是Go泛型的详细使用方法及示例:
1. 声明泛型类型使用方括号 [] 声明类型参数,并通过 any(或自定义约束)指定类型范围。示例:
// 定义泛型切片类型,T可以是任意类型type List[T any] []T// 定义泛型结构体type Pair[K, V any] struct { Key K Value V}2. 使用泛型类型泛型类型可像普通类型一样使用,但需在实例化时指定具体类型。示例:
// 实例化泛型类型intList := List[int]{1, 2, 3}strList := List[string]{"a", "b", "c"}// 使用泛型结构体p := Pair[string, int]{Key: "age", Value: 30}3. 泛型函数在函数中声明类型参数,实现多类型支持。示例:
// 泛型函数:打印任意类型的切片func PrintSlice[T any](s []T) { for _, v := range s { fmt.Println(v) }}// 调用示例PrintSlice[int]([]int{1, 2, 3})PrintSlice[string]([]string{"hello", "world"})4. 类型约束通过接口约束类型参数的范围(需定义约束接口)。示例:
// 定义约束:类型必须为数值类型type Number interface { int | float64}// 泛型函数:仅接受数值类型func Sum[T Number](a, b T) T { return a + b}// 调用示例Sum(1, 2) // 合法Sum(1.5, 2.5) // 合法Sum("a", "b") // 编译错误5. 泛型方法为泛型类型定义方法,方法可操作类型的参数化部分。示例:
// 为List[T]定义泛型方法func (l List[T]) Push(v T) { l = append(l, v)}// 使用示例var list List[int]list.Push(10)6. 泛型与标准库Go 1.18+ 的标准库(如 slices、maps)已内置泛型支持。示例:
import "slices"func main() { nums := []int{3, 1, 4} slices.Sort(nums) // 直接使用泛型排序}Go泛型的优势通过合理使用泛型,可以显著提升Go代码的灵活性和简洁性。如需深入学习,可参考官方文档或社区教程(如《Go语言免费学习笔记(深入)》)。