跳到主要内容

类型参数

类型参数是什么? 类型实参与约束分别指什么?​

  • generic: 声明时保留类型占位符, 使用时再指定具体类型;
  • type parameter: 类型参数, 写在方括号中;
  • type argument: 调用或实例化时提供的具体类型;
  • constraint: 类型参数必须满足的约束;
// T 是类型参数,any 是约束。
func Identity[T any](v T) T {
return v
}
func main() {
// int 是类型实参,7 是普通实参。
result := Identity[int](7)
println(result)
}

泛型函数如何声明?​

  • 声明过程: 在函数名后用 [T 约束] 引入类型参数,再在输入与输出中使用 T,让编译器检查它们的类型关系;
  • 输入前提: 示例 First 要求切片非空,空切片会在访问 items[0] 时 panic;需要表达空集合时可另返回 ok;
func First[T any](items []T) T { // T 为类型参数; any 为约束
return items[0] // 返回值类型为 T
}

如何调用泛型函数? 类型推导失败怎么办?​

  • 类型推导: 编译器可根据普通参数推导类型参数;
  • 推导失败: 需要显式写出类型实参;
func main() {
a := First[int]([]int{1, 2, 3}) // 显式提供类型实参 int
b := First([]string{"go", "lang"}) // 编译器根据参数推导 T 为 string
println(a, b)
}