Go空切片和nil切片

在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

posted @ 2025-08-29 14:13  朝阳1  阅读(9)  评论(0)    收藏  举报