go语言中切片的长度和容量详解
Go 语言中,切片(Slice) 是一种动态数组,它的核心特性由 长度(Length) 和 容量(Capacity) 共同定义。这两个概念是操作切片时的关键,理解它们的含义和区别能帮助你高效管理内存并避免常见错误。
一、长度(Length)
-
定义:切片的长度表示当前包含的实际元素个数,即可以通过索引访问的元素数量。
-
获取方式:使用
len(slice)
函数获取。 -
用途:
-
确定切片当前的有效数据范围。
-
遍历切片时,循环的上界通常是长度(
for i := 0; i < len(s); i++
)。
-
-
示例:
s := []int{1, 2, 3} fmt.Println(len(s)) // 输出 3
二、 容量(Capacity)
-
定义:切片的容量表示底层数组从切片的起始位置到数组末尾的最大可扩展元素个数。
-
获取方式:使用
cap(slice)
函数获取。 -
用途:
-
判断切片在不分配新内存的情况下,最多能追加多少元素。
-
优化性能时,预分配容量避免频繁扩容。
-
-
示例:
s := make([]int, 3, 5) // 长度3,容量5 fmt.Println(cap(s)) // 输出 5
三、长度与容量的关系
1. 初始状态
s := make([]int, 3, 5)
-
内存示意图:
+---+---+---+---+---+ | 0 | 0 | 0 | | | // 前3个元素已初始化,后2个为预留空间 +---+---+---+---+---+ ↑ ↑ 起始位置 容量边界
-
长度:3(可访问
s[0]
,s[1]
,s[2]