0Pricing
Go Academy · 课时

类型参数语法

使用 [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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 类型参数语法
  2. 约束:comparable 与接口
  3. 泛型数据结构
  4. 实际使用泛型:常见陷阱
← 返回 Go Academy