【Go Generics】泛型为何而生的
结论:它的诞生是为了解决:重载
泛型是 Go 1.18 才加入的核武器,它的诞生是为了解决另一个痛苦:代码极其恶心的重复(Don't Repeat Yourself)。
没有泛型时的痛苦(逼死强迫症)
假设你在公共库morph里,想写一个工具函数:传入两个整数,返回最大的那一个。
func MaxInt(a, b int) int { if a > b { return a } return b }写完没几天,你发现业务里还需要对比两个float64、两个int64的大小。
在没有泛型的时候,Go 官方又没有重载(Overload)功能,你只能痛苦地复制粘贴,写出极其丑陋的代码:
func MaxFloat64(a, b float64) float64 { ... } func MaxInt64(a, b int64) int64 { ... }全天下写 Go 的人都在骂:就为了改个类型,老子要写三遍一模一样的逻辑,这不纯粹是体力活吗?
有了泛型(Generics)后的终极救赎
泛型,顾名思义,就是“把类型当成变量一样传进去”。
有了泛型,你只需要写一个函数,就能通吃全天下所有的数字类型:
// [T int | int64 | float64] 代表:这个函数支持这三种类型,用 T 来代替 func Max[T int | int64 | float64](a, b T) T { if a > b { return a } return b }当你调用时:
Max(1, 2)$\rightarrow$ Go 自动识别T是int。Max(1.5, 2.5)$\rightarrow$ Go 自动识别T是float64。
总结:泛型的出现,是为了重载
让你在“逻辑完全相同,只有数据类型不同”的场景下(比如实现一个通用的切片去重、通用的 Map 过滤、或者通用的缓存加载),只写一份代码。
泛型(Generics)关注的是“数据类型(Type)”:比如“不管是 int 还是 string,这段内存剥离逻辑都长一样”。它的核心是消除重复代码。
