用途:整理 Go 内置数据结构(切片、映射、数组)的正确使用规则,防止别名、nil 与迭代顺序相关的隐蔽缺陷。
主要能力:
- nil 切片与空切片:var a []int 为 nil,b := []int{} 与 make([]int,0) 为空切片;len、cap、range、append 对三者行为一致。优先用 nil 表示“无元素”,但 JSON 场景下 nil 序列化为 null、空切片为 [],契约要求 [] 时须显式返回空切片;逻辑判断统一用 len(s)==0。
- append 与别名:append 可能复用底层数组,向不属于自己的切片 append 会写入调用方数组;返回大数组的子切片会长期持有整个底层数组,需用 slices.Clone(Go 1.21+)或 copy 复制。原则是函数要么拥有切片,要么复制它。
- 预分配:已知或可界定大小时用 make([]string,0,len(users))、make(map[string]int,len(items)) 一次分配;大小未知时不要预分配。
- 映射要点:comma-ok 区分缺失与零值;读 nil map 安全,写 nil map 会 panic,需先 make;迭代顺序随机,需确定性输出时排序键(如 slices.Sorted(maps.Keys(m)),Go 1.23+);map 值不可寻址,结构体值需用指针 map 或读改写;range 中删除安全,插入行为未定义。
- 集合:惯用 map[string]struct{},struct{} 占零字节;map[string]bool 可读性更好。
- 数组与切片:数组是值类型,赋值与传参整体复制,元素可比较时可用 ==;适合哈希 [32]byte、IPv4、固定矩阵、map 键等固定大小且需值语义的场景,其余用切片。
- 结构选择:有序可增长用 []T,去重/成员判断用 map[K]struct{},键值查找用 map[K]V,固定大小值语义用 [N]T,FIFO 队列用带 head 索引的切片或 container/list,栈用切片加 append 与截断;并发 map 仅在只增缓存、键集不相交等特殊场景用 sync.Map,默认 map 加 sync.RWMutex。
使用方式:作为编码与评审时的检查清单,逐条核对 nil/空切片判断、JSON 契约、append 所有权、子切片复制、预分配、comma-ok、nil map 写入、迭代排序、集合写法与数组使用。
限制:资料未提供安装命令、运行环境、版本兼容细节与配套工具信息,暂未提供。