Go 内置函数clear

1. 功能与语法

clear 函数用于清空 切片(slice)映射(map) 中的元素,支持泛型类型参数。
函数签名

func clear[T ~[]Type | ~map[Type]Type1](t T)

对不同类型的作用

类型行为示例结果(长度/容量)
切片将切片内所有元素设置为对应类型的零值,保留原始长度和容量。[0 0 0 0](len=4, cap=4)
映射删除所有键值对,映射变为空(len=0)。map[](len=0)
泛型类型类型参数必须是切片或映射(如 type MySlice[T any] []T)。行为与普通切片/映射一致

2. 代码示例

(1) 清空切片

s := []int{1, 2, 3, 4}
clear(s)
fmt.Printf("len: %d, cap: %d, elems: %v\n", len(s), cap(s), s) 
// 输出:len: 4, cap: 4, elems: [0 0 0 0]

(2) 清空映射

m := map[string]int{"Apple": 1, "Banana": 2}
clear(m)
fmt.Printf("len: %d, elems: %v\n", len(m), m) 
// 输出:len: 0, elems: map[]

(3) 自定义泛型类型

type MySlice[T any] []T
mySlice := MySlice[string]{"Go", "Gopher"}
clear(mySlice)
fmt.Printf("elems: %v\n", mySlice) 
// 输出:elems: [  ](字符串零值为空字符串)

3. 注意事项

  1. 切片清空逻辑
    clear 仅将元素置零,不会释放内存(保留容量)。
    • 若需完全重置切片(长度和容量归零),需手动赋值 nil 或新建切片: s = nil // 释放内存,len=0, cap=0 s = make([]T, 0) // 新建空切片
  2. 特殊值处理
    • 对包含 NaN(Not a Number) 的映射,clear 能正确删除所有条目(包括 NaN)。
  3. 泛型约束
    • 自定义泛型类型必须仅包含切片或映射类型(如 type MyMap[K comparable, V any] map[K]V)。

4. 适用场景

  • 快速重置容器:避免手动循环置零或删除映射条目。
  • 内存复用:保留切片容量,减少重复内存分配开销。
  • 泛型代码简化:统一处理切片和映射的清空逻辑。

总结

clear 函数为 Go 开发者提供了一种高效、统一的方式清空切片和映射,尤其在处理泛型容器时简化了代码逻辑。然而,需注意其对切片内存管理的局限性,必要时仍需手动调整长度和容量。

滚动至顶部