类型参数语法
使用 [T any] 编写泛型函数与类型
类型参数语法 是 CoddyKit 上的免费 Go Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。
泛型背景
在 Go 1.18 之前,要让代码适用于多种类型,必须使用 interface{}/any(会失去类型安全性)或代码生成。泛型增加了类型参数,从而实现编译时多态。
泛型函数语法
在函数名后的方括号中声明类型参数:
func Map[T, U any](s []T, f func(T) U) []U {
result := make([]U, len(s))
for i, v := range s {
result[i] = f(v)
}
return result
}
nums := Map([]int{1,2,3}, func(n int) string {
return strconv.Itoa(n)
})类型推断
在大多数情况下,编译器会从函数参数推断类型实参。如果推断失败,您可以显式指定类型实参。
// Inferred:
nums := Map([]int{1,2,3}, strconv.Itoa)
// Explicit:
nums := Map[int, string]([]int{1,2,3}, strconv.Itoa)泛型类型
结构体和其他类型也可以拥有类型参数:
type Stack[T any] struct {
items []T
}
func (s *Stack[T]) Push(v T) { s.items = append(s.items, v) }
func (s *Stack[T]) Pop() (T, bool) {
if len(s.items) == 0 { var zero T; return zero, false }
n := len(s.items)-1
v := s.items[n]
s.items = s.items[:n]
return v, true
}多个类型参数
函数和类型可以拥有多个类型参数:
type Pair[K, V any] struct { Key K; Value V }
func Zip[K, V any](keys []K, vals []V) []Pair[K, V] {
result := make([]Pair[K, V], min(len(keys), len(vals)))
for i := range result {
result[i] = Pair[K, V]{keys[i], vals[i]}
}
return result
}类型参数的零值
使用 var zero T 声明零值变量。当从泛型函数返回“无值”结果时,这是必需的。
func First[T any](s []T) (T, bool) {
if len(s) == 0 { var zero T; return zero, false }
return s[0], true
}泛型类型的方法
泛型类型的方法使用该类型的参数,而不是自己的参数。方法不能引入额外的类型参数。
type Pair[K, V any] struct{ K K; V V }
func (p Pair[K, V]) Swap() Pair[V, K] { return Pair[V, K]{p.V, p.K} }实例化
使用带有具体类型实参的泛型类型称为实例化。它发生在编译时而不是运行时——不会产生装箱开销。
s := Stack[int]{}
s.Push(42)类型别名与泛型类型
您可以为已实例化的泛型类型创建类型别名:
type IntStack = Stack[int]限制
类型参数不能与类型切换或类型断言一起使用。泛型类型的方法不能拥有额外的类型参数。没有约束时,泛型不能用于需要运算符重载的类型。
何时使用泛型
对于真正与类型无关的算法(容器类型、Map/Filter/Reduce 等函数式辅助工具),如果替代方案会导致代码重复或不安全的类型转换,请使用泛型。
快速检查
泛型函数中在哪里声明类型参数?
回顾:类型参数语法
关键要点:
- 类型参数位于方括号中:func Foo[T any](...)
- 适用于函数和类型(结构体等)
- 在大多数情况下,编译器会从参数推断类型实参
- 零值:var zero T;方法级别没有类型参数
常见问题解答
「类型参数语法」课时是免费的吗?
是的 — 「类型参数语法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。
「类型参数语法」这节课中我会学到什么?
使用 [T any] 编写泛型函数与类型 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Go Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「类型参数语法」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Go Academy 课中编写并运行代码吗?
能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。