Go 内置函数clear

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 同时处理切片和映射,无需分别实现。
滚动至顶部