类型约束与接口

1. 什么是类型约束

类型约束用于限制泛型函数或类型中类型参数所允许的类型。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 起内置部分)用于常见约束:

import "golang.org/x/exp/constraints"

func Add[T constraints.Integer](a, b T) T {
    return a + b
}

3. 自定义约束接口

你也可以自定义接口作为约束:

type Stringer interface {
    String() string
}

func PrintString[T Stringer](s T) {
    fmt.Println(s.String())
}

4. 使用 any 表示无限制类型

如果不需要约束类型参数,可以使用 any,等价于空接口 interface{}

func Identity[T any](v T) T {
    return v
}

5. 类型集合(Go 1.20+)

你也可以使用联合类型:

type Number interface {
    ~int | ~float64
}

~ 表示底层类型,常用于匹配自定义类型。


类型约束是泛型机制的核心,使得泛型既灵活又具备类型安全,是编写健壮可复用代码的重要工具。