在Go语言中,空切片(empty slice)和nil切片(nil slice)虽然长度和容量都为0,但在底层实现和使用场景上存在关键差异:
定义与创建方式
nil切片:仅声明未初始化(var s []int),底层数组指针为nil,内存未分配
空切片:显式初始化但无元素(s := []int{}或make([]int, 0)),底层指针可能指向空数组,已分配内存
内存分配差异
nil切片不占用堆内存,仅存在栈上的切片结构体(指针nil+len/cap=0)
空切片可能触发内存分配(取决于创建方式),如make([]int, 0, 5)会预分配容量为5的底层数组
行为特性对比
特性 nil切片 空切片
==nil判断 true false
JSON序列化 输出null 输出[]
append操作 首次追加触发内存分配 可能复用预分配空间
内存地址稳定性 追加后地址必变 容量足够时地址不变
典型使用场景
nil切片:表示逻辑上"不存在"的切片(如错误返回值)
空切片:表示"存在但为空"的集合(如预分配容量的缓冲区)
特殊注意:两者均可安全调用len()/cap()和append(),但nil切片直接索引会panic