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. 注意事项
- 切片清空逻辑:
•clear
仅将元素置零,不会释放内存(保留容量)。
• 若需完全重置切片(长度和容量归零),需手动赋值nil
或新建切片:s = nil // 释放内存,len=0, cap=0 s = make([]T, 0) // 新建空切片
- 特殊值处理:
• 对包含 NaN(Not a Number) 的映射,clear
能正确删除所有条目(包括 NaN)。 - 泛型约束:
• 自定义泛型类型必须仅包含切片或映射类型(如type MyMap[K comparable, V any] map[K]V
)。
4. 适用场景
- 快速重置容器:避免手动循环置零或删除映射条目。
- 内存复用:保留切片容量,减少重复内存分配开销。
- 泛型代码简化:统一处理切片和映射的清空逻辑。
总结
clear
函数为 Go 开发者提供了一种高效、统一的方式清空切片和映射,尤其在处理泛型容器时简化了代码逻辑。然而,需注意其对切片内存管理的局限性,必要时仍需手动调整长度和容量。
