Go中的泛型与any、interface有什么区别?

Go中的泛型与any、interface有什么区别?

具体案例可看泛型 | Golang 中文学习文档

  • any = interface{}Go 1.18 以后,any 就是空接口 的别名,两者完全一样
  • 空接口 /any:能装所有类型 ,但会丢失类型信息
  • 泛型 [T int|string]类型模板保留类型信息,编译时检查

any / interface{} = 黑色垃圾袋

啥都能装苹果、香蕉、石头、玩具,装进去后,你不知道里面装的是什么,拿出来必须摸一摸、猜一猜(类型断言),猜错了直接崩溃(panic)。

泛型 [T int|string] = 定制水果盒

这个盒子只能装苹果 / 香蕉,装的时候就知道是什么,拿出来直接吃,不用猜,绝对不会装错,编译时就帮你检查好了

什么时候用哪个?

✅ 用 any /interface {} 的场景

你只需要存储 / 传递数据,完全不关心它是什么类型,也不操作它

  • 打印日志 fmt.Println(任意值)
  • 存任意类型的 map map[string]any
  • 不需要解析的通用消息(比如简单透传)
  • 你真的不知道、也不需要知道传进来的是什么
go 复制代码
// 例子:打印任何东西(用any最合适)
func PrintAny(v any) {
    fmt.Println(v)
}

✅ 用 泛型 的场景

你要对数据做操作(加减、比较、遍历、修改),又想复用代码,还想安全

  • 通用切片去重
  • 通用栈 / 队列
  • 通用比较大小
  • 通用数据处理工具
  • 你希望一套代码支持多种类型,但不想丢失类型安全
go 复制代码
// 泛型:加法函数,支持 int / float64
func Add[T int | float64](a T, b T) T {
    return a + b
}

// 直接用,不用断言!
Add(1, 2)       // int
Add(1.5, 2.3)   // float64
用 any 实现加法(麻烦、不安全)
go 复制代码
func AddAny(a any, b any) (any, error) {
    // 必须断言!!!
    switch a.(type) {
    case int:
        return a.(int) + b.(int), nil
    case float64:
        return a.(float64) + b.(float64), nil
    default:
        return nil, errors.New("不支持的类型")
    }
}

// 用起来超级麻烦
res, _ := AddAny(1, 2)
fmt.Println(res) // 还是any类型,不能直接计算
相关推荐
2501_933329551 天前
媒介宣发技术实践:Infoseek舆情系统的AI中台架构与应用解析
开发语言·人工智能·架构·数据库开发
[J] 一坚1 天前
嵌入式高手C
c语言·开发语言·stm32·单片机·mcu·51单片机·iot
odoo中国1 天前
Odoo 19技术教程 : 如何在 Odoo 19 中创建 Many2one 组件
开发语言·odoo·odoo19·odoo技术·many2one
逻辑驱动的ken1 天前
Java高频面试考点场景题14
java·开发语言·深度学习·面试·职场和发展·求职招聘·春招
techdashen1 天前
Cloudflare 如何把一个大型代理拆成三个小服务来提升可靠性
开发语言·rust
geovindu1 天前
go: Chain of Responsibility Pattern
开发语言·设计模式·golang·责任链模式
十五年专注C++开发1 天前
WaitingSpinnerWidget: 一个高度可配置的自定义Qt等待加载动画组件
开发语言·c++·qt·waitingspinner
阿丰资源1 天前
基于SpringBoot的在线视频教育平台的设计与实现(附源码+数据库+文档,一键运行)
数据库·spring boot·后端
苍煜1 天前
ThreadPoolExecutor线程池终极全解:同步异步判定+SpringBoot生产实战
java·开发语言·spring boot
IT_陈寒1 天前
我竟然被JavaScript的隐式类型转换坑了三天!
前端·人工智能·后端