# 类型约束与接口

URL: https://caijiao.org/go/08-advanced/02-type-constraints
Source: docs/go/08-advanced/02-type-constraints.md
Description: 本节讲解 Go 泛型中的类型约束与接口，说明如何限制类型参数以增强泛型函数的灵活性与安全性。

## 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
}
```

`~` 表示底层类型，常用于匹配自定义类型。

---

类型约束是泛型机制的核心，使得泛型既灵活又具备类型安全，是编写健壮可复用代码的重要工具。
