# 泛型函数与类型

URL: https://caijiao.org/go/08-advanced/01-generics
Source: docs/go/08-advanced/01-generics.md
Description: 本节介绍 Go 1.18+ 中引入的泛型（Generics）功能，重点讲解泛型函数与类型的定义与使用方式。

## 1. 泛型简介

Go 从 1.18 开始支持泛型（Generics），允许函数和类型接受类型参数，从而实现更强的代码复用。

## 2. 泛型函数定义

泛型函数在函数名前使用类型参数（如 `[T any]`）：

```go
func PrintSlice[T any](s []T) {
    for _, v := range s {
        fmt.Println(v)
    }
}
```

调用方式无需显式指定类型，Go 会自动推导：

```go
PrintSlice([]int{1, 2, 3})
PrintSlice([]string{"a", "b", "c"})
```

## 3. 泛型类型定义

可以为结构体、接口等定义泛型类型：

```go
type Pair[T any] struct {
    First  T
    Second T
}

p := Pair[int]{First: 1, Second: 2}
```

## 4. 多类型参数

泛型函数/类型可以使用多个类型参数：

```go
func Compare[T comparable](a, b T) bool {
    return a == b
}
```

## 5. 泛型优势

- 减少重复代码
- 增强代码复用
- 保持类型安全

---

泛型的引入让 Go 更加现代化，能以更简洁的方式编写通用逻辑。
