clear 是什么
clear 是 Go 1.21 引入的内置泛型函数,用于清空切片或映射:
func clear[T ~[]Type | ~map[Type]Type1](t T)
对不同类型的行为
| 类型 | 行为 | 结果示例 |
|---|---|---|
| 切片 | 把所有元素置为零值,保留 len 和 cap | [0 0 0 0](len=4, cap=4) |
| 映射 | 删除所有键值对 | map[](len=0) |
| 泛型容器 | 类型参数须为切片/映射类型,行为与上一致 | — |
// 切片:元素归零,长度容量不变
s := []int{1, 2, 3, 4}
clear(s)
fmt.Println(s) // [0 0 0 0],len=4, cap=4
// 映射:清空
m := map[string]int{"A": 1, "B": 2}
clear(m)
fmt.Println(m) // map[],len=0
// 自定义泛型切片
type MySlice[T any] []T
ms := MySlice[string]{"Go", "Gopher"}
clear(ms) // ["", ""]
关键注意点

- clear 不释放内存:切片元素归零但底层数组保留,容量不变。需要真正释放时手动置 nil(
s = nil)或新建切片; - NaN 键也能删:映射里以 NaN 为键的条目普通遍历删不掉(NaN ≠ NaN),clear 能正确清除——这是它比”遍历删除”更可靠的地方;
- 清空 ≠ 置 nil:要区分”复用容器”(clear,保留容量避免重新分配)和”释放内存”(置 nil);
- 泛型约束:自定义类型必须本质是切片或映射(如
type MyMap[K comparable, V any] map[K]V)。
适用场景
- 快速重置容器:替代手动循环置零/逐键删除,代码简洁且语义清晰;
- 内存复用:连接池、对象池里清空切片再复用,减少分配;
- 泛型代码统一:一个 clear 同时处理切片和映射,无需分别实现。
