【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)功能,你只能痛苦地复制粘贴,写出极其丑陋的代码:

Go 复制代码
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 自动识别 Tint
  • Max(1.5, 2.5) \\rightarrow Go 自动识别 Tfloat64

总结:泛型的出现,是为了重载

让你在"逻辑完全相同,只有数据类型不同"的场景下(比如实现一个通用的切片去重、通用的 Map 过滤、或者通用的缓存加载),只写一份代码。

泛型(Generics)关注的是"数据类型(Type)":比如"不管是 int 还是 string,这段内存剥离逻辑都长一样"。它的核心是消除重复代码。

相关推荐
名字还没想好☜1 小时前
Go 1.21 context.WithoutCancel 实战:父 context 取消了,收尾任务还要继续跑
开发语言·后端·golang·go
newerp2 小时前
Golang 接口的两副面孔:eface、iface 与动态派发之谜
后端·程序员·go
明月_清风2 小时前
递归算法:从原理到实战,一次讲透
后端·算法·go
运维开发笔记3 小时前
9.1 Go Interface 基础知识学习笔记
go
a187927218314 小时前
【算法】回溯算法(一):从一道 IP 题到万能模板
算法·leetcode·go·回溯·leetcode93·ip复原·算法讲解
名字还没想好☜4 小时前
Go 用 -race 抓数据竞争:一个偶发崩溃的排查、原理与修复
开发语言·后端·golang·go
Vespeng18 小时前
打破传统 MVC:在 Go 中实践高内聚的业务驱动架构
架构·go·gin
用户029669769821 天前
摸着石头过河:我用Go把微信加密模块给逆向了一回
微信·go
idcu1 天前
CodeSchema 开源首发:一个给 AI 编码助手「喂」精准代码上下文的索引服务
开源·go·ai编程
newerp2 天前
Golang 切片扩容策略
后端·程序员·go