网站首页 > 技术文章 正文
来源:械说
以下是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 使用时注意性能与可读性的权衡。
猜你喜欢
- 2025-07-10 Python 元组(Tuple)详解(python元组用来做什么)
- 2025-07-10 Excel如何去除前导0,中间和末尾的0不去除?送大家一条通用公式
- 2025-07-10 轻松搞定统计分析的Excel函数公式实用技巧解读
- 2025-07-10 一文学会Python编程中的一种数据结构——元组(tuple)
- 2025-07-10 Excel必看的20个函数公式!(excel函数公式大全百度文库)
- 2025-07-10 提取单元格中的手机号,这些公式你会几个
- 2025-07-10 EXCEL函数 RANK函数 MAX函数 MIN函数 LARGE函数 SMALL函数
- 2025-07-10 8个常用多条件统计公式,看看哪个还不熟?
- 2025-07-10 秒懂结构体+函数封装!这个温度转换器项目干货拉满
- 2025-07-10 office计算机二级考试Excel常考内容(3)
- 1510℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 545℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 498℃MySQL service启动脚本浅析(r12笔记第59天)
- 478℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 476℃启用MySQL查询缓存(mysql8.0查询缓存)
- 455℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 436℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 433℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)