Golang泛型怎么定义和使用_Golang泛型基础教程【实用】

张开发
2026/4/13 20:04:00 15 分钟阅读

分享文章

Golang泛型怎么定义和使用_Golang泛型基础教程【实用】
泛型函数需声明类型参数并添加约束如[T comparable]或自定义interface无约束的[T any]无法进行比较或运算函数名后紧跟[T Constraint]不可有空格支持类型推断但需确保参数明确。泛型函数怎么写参数和约束怎么配泛型函数的核心是「类型参数 约束」不是随便加个 [T] 就行。没约束的 [T any] 虽然能编译但几乎没法做比较、加减或调用方法——编译器不知道 T 支持什么操作。comparable 是最常用约束用于需要 、! 的场景比如查找、去重但 struct 或含切片/映射的类型不能用它数值计算别用 any得自己定义约束例如type Number interface{ ~int | ~float64 }其中 ~ 表示底层类型匹配函数名后紧接 [T Constraint]不能空格也不能写成 func foo(T) —— 这是语法错误编译直接报 expected ], found T类型推断很实用PrintSlice([]int{1,2}) 不用写 PrintSlice[int]但一旦参数类型不明确比如传 nil 或混用接口就得显式实例化泛型结构体怎么声明和初始化泛型结构体不是“模板类”而是编译时生成的具体类型。你声明 Stack[T]用 Stack[int] 和 Stack[string] 是两个完全不同的类型不能互相赋值反射里也看不出“泛型”痕迹。字段类型必须用类型参数如 data []T不能写 []interface{} 或 []any —— 那就失去类型安全了方法接收器要带泛型参数func (s *Stack[T]) Push(item T)漏掉 [T] 会报 undefined: T初始化时不能只写 Stack{}必须指定类型Stack[int]{} 或 var s Stack[string]用 new(Stack[int]) 也合法但返回的是指针嵌套泛型要注意括号比如 Map[K comparable, V any]两个参数之间用逗号不是分号或空格什么时候该用泛型而不是 interface{}泛型不是银弹。如果只是简单透传、不做运算或比较用 interface{} 反而更轻量但只要涉及类型内联操作比如对元素求和、排序、深比较泛型立刻比运行时类型断言反射更安全、更快。用 interface{} 类型断言容易 panic断言失败、无编译检查、每次调用都有反射开销用泛型编译期检查类型合法性零运行时开销生成的代码和手写 SumInts/SumFloat64s 性能一致典型误用给日志函数加泛型参数 Log[T any](v T) —— 它只打印不依赖 T 行为纯属画蛇添足混合策略可行函数参数用泛型保证输入安全内部再转成接口做通用处理比如序列化但别为了“看起来统一”硬套泛型常见编译错误和调试技巧泛型报错信息往往指向“实例化失败”而不是你写的那行容易让人懵。关键要盯住约束是否满足、类型是否可推导、有没有循环引用。 Mokker AI AI产品图添加背景

更多文章