怪奇物语

怪奇物语

首页 新随笔 联系 管理

Go语言 goalng 切片 slice 空切片 nil切片

一、基础概念

  • 长度(len):切片当前包含的元素数量。
  • 容量(cap):底层数组能容纳的最大元素数量。
  • nil切片len=0, cap=0slice == nil
  • 非nil切片:即使 len=0,只要 slice != nil

二、初始化方法分类

1. nil切片

var a []int // nil切片
  • 特性:len=0, cap=0,且 a == niltrue

2. 空切片

b := []int{} // 空切片
  • 特性:len=0, cap=0,但 b != nil

3. 字面量初始化

c := []int{1, 2, 3} // 3元素切片
  • 特性:len=3, cap=3,自动分配底层数组。

4. 切片操作

(1) 截取子切片

d := c[:2] // 截取前2个元素
  • 特性:len=2, cap=3(继承原切片容量)。

(2) 显式指定容量

e := c[0:2:cap(c)] // 显式指定容量
e1 := c[0:2:2]     // 容量不足时取最小值
  • elen=2, cap=3(合法)。
  • e1len=2, cap=2(容量不能超过原底层数组的可用空间)。

(3) 截取0元素

f := c[:0] // 截取0个元素
  • 特性:len=0, cap=3(保留原容量)。

5. make函数

(1) 不指定容量

g := make([]int, 3) // make创建3元素
  • 特性:len=3, cap=3(长度与容量相同)。

(2) 指定容量

h := make([]int, 2, 3) // 指定长度和容量
  • 特性:len=2, cap=3(可独立设置 lencap)。

(3) 容量空切片

i := make([]int, 0, 3) // 容量3的空切片
  • 特性:len=0, cap=3(预分配容量但无元素)。

三、关键区别对比表

变量 初始化方式 len cap 类型 说明
a var []int 0 0 nil切片 a == niltrue
b []int{} 0 0 非nil切片 空切片但 b != nil
c []int{1,2,3} 3 3 非nil切片 自动分配底层数组
d c[:2] 2 3 非nil切片 截取子切片,保留原容量
e c[0:2:cap(c)] 2 3 非nil切片 显式指定容量,合法
e1 c[0:2:2] 2 2 非nil切片 容量不能超过原底层数组的可用空间
f c[:0] 0 3 非nil切片 截取0元素但保留原容量
g make([]int,3) 3 3 非nil切片 lencap 相同
h make(2,3) 2 3 非nil切片 独立设置 lencap
i make(0,3) 0 3 非nil切片 预分配容量但无元素

四、注意事项

  1. nil切片与空切片

    • a == niltrueb == nilfalse
    • make([]int,0,0) 等价于 []int{}(空切片)。
  2. 容量限制

    • 使用 slice[start:end:cap] 时,指定的容量不能超过原底层数组的可用空间。
  3. 性能优化

    • 预分配容量(如 make([]int, 0, 3))可避免频繁扩容。
    • 追加元素时,若容量不足会触发扩容(默认翻倍)。
posted on 2025-04-23 08:00  超级无敌美少男战士  阅读(37)  评论(0)    收藏  举报