主题
类型约束与接口
1. 什么是类型约束
类型约束用于限制泛型函数或类型中类型参数所允许的类型。Go 使用接口类型作为约束。
泛型函数示例:
go
func Max[T constraints.Ordered](a, b T) T {
if a > b {
return a
}
return b
}
其中 constraints.Ordered
表示支持 < <= > >=
等运算的类型(如 int、float、string)。
2. 使用标准库约束
Go 官方提供 golang.org/x/exp/constraints
(或 Go 1.20 起内置部分)用于常见约束:
go
import "golang.org/x/exp/constraints"
func Add[T constraints.Integer](a, b T) T {
return a + b
}
3. 自定义约束接口
你也可以自定义接口作为约束:
go
type Stringer interface {
String() string
}
func PrintString[T Stringer](s T) {
fmt.Println(s.String())
}
4. 使用 any 表示无限制类型
如果不需要约束类型参数,可以使用 any
,等价于空接口 interface{}
:
go
func Identity[T any](v T) T {
return v
}
5. 类型集合(Go 1.20+)
你也可以使用联合类型:
go
type Number interface {
~int | ~float64
}
~
表示底层类型,常用于匹配自定义类型。
类型约束是泛型机制的核心,使得泛型既灵活又具备类型安全,是编写健壮可复用代码的重要工具。