优秀的编程知识分享平台

网站首页 > 技术文章 正文

Go 语言泛型 — 泛型语法与示例(go2 泛型)

nanyue 2025-07-10 19:40:42 技术文章 2 ℃

来源:械说

以下是Go语言中关于Go 泛型 - 泛型语法与示例的详解,适合泛型入门学习和实际开发使用:

一、什么是泛型(Generics)?

泛型是一种支持“类型参数”的机制,可以让函数、类型等支持多种数据类型,提高代码复用性。

Go 从1.18 版本开始正式支持泛型,主要体现在:

  • o 泛型函数
  • o 泛型类型(结构体、接口等)
  • o 类型约束(constraints)

二、基本语法格式泛型函数的声明funcPrintSlice[Tany](s []T) {for_, v :=ranges { fmt.Println(v) }}

  • o T 是类型参数。
  • o [T any] 表示 T 可接受任意类型(any 是 interface{} 的别名)。

泛型类型的声明typeStack[T any]struct{ elements T}func(s *Stack[T]) Push(v T) { s.elements =append(s.elements, v)}func(s *Stack[T]) Pop T { l :=len(s.elements) val := s.elements[l-1] s.elements = s.elements[:l-1]returnval}

三、多个类型参数funcCompare[Kcomparable,Vany](amap[K]V, bmap[K]V)bool{iflen(a) !=len(b) {returnfalse}fork, v :=rangea {ifb[k] != v {returnfalse} }returntrue}

  • o K comparable 限定 K 必须是可比较类型(如用于 map key)。
  • o V any 无限制。

四、类型约束(Constraints)使用接口作为约束typeAddableinterface{int|float64}funcSum[TAddable](a, b T) T {returna + b}

  • o 类型集 int | float64 表示 T 可以是 int 或 float64。
  • o Addable 是一个“约束接口”。

五、泛型实战示例1. 泛型排序函数funcMin[Tconstraints.Ordered](a, b T) T {ifareturna }returnb}

  • o constraints.Ordered 是标准库提供的类型约束,表示支持 = > 的类型。

2. 泛型 Map 函数(函数式编程)funcMap[Tany,Rany](list T, ffunc(T) R) R {varresult Rfor_, v :=rangelist { result =append(result, f(v)) }returnresult}

使用:

squares := Map(int{1,2,3},func(xint)int{returnx * x })fmt.Println(squares)// [1 4 9]

六、类型推断

Go 支持自动类型推断:

PrintSlice([]string{"a","b","c"})

也可以显式指定类型参数:

PrintSlice[string]([]string{"a","b"})

七、标准库中的泛型支持(Go 1.18+)

Go 1.18+ 在
golang.org/x/exp/constraints 提供了常用的类型约束:

import"golang.org/x/exp/constraints"funcMax[Tconstraints.Ordered](a, b T) T {ifa > b {returna }returnb}

八、使用建议

  • 建议
  • 说明
  • 用于数据结构通用化如 Stack、Queue、Map 等
  • 用于通用算法封装如排序、筛选、映射、聚合
  • 避免过度使用泛型不如接口清晰时不必用泛型
  • 配合类型约束提高类型安全性与可读性

九、小结

  • o 泛型让 Go 支持了更高层次的抽象与复用,不再需要写多版本函数。
  • o 与接口并用,可构建健壮、通用的框架组件。
  • o 使用时注意性能与可读性的权衡。
最近发表
标签列表