Golang 第四章 2.切片

  • By v2ray节点

  • 2026-03-24 15:58:37

  • 评论


切片是 基于数组的动态序列,它比数组更灵活。

切片可以动态增长
切片共享底层数组
切片长度可变,容量可查



创建切片

从数组创建切片:

a := [5]int{1, 2, 3, 4, 5}
s := a[1:4] // 包含索引 1 到 3 的元素 → [2,3,4]

a[low : high] → 包含 low 索引,不包含 high 索引



切片长度和容量

len(s) // 切片长度cap(s) // 切片容量

长度(len) → 切片中元素数量

容量(cap) → 从切片开始到底层数组末尾的元素数量

示例:

a := [5]int{1,2,3,4,5}
s := a[1:3]
fmt.Println(len(s)) // 2
fmt.Println(cap(s)) // 4 (从索引 1 到索引 4)


创建空切片

var s []int        // nil 切片
s = []int{}        // 空切片,长度 0


切片字面量

s := []int{1, 2, 3} // 不需要指定长度


切片追加元素

s = append(s, 4, 5)

append 返回新的切片
如果容量不足,Go 会分配新数组



遍历切片

for i, v := range s {
    fmt.Println(i, v)
}


切片共享底层数组

多个切片可以 共享同一数组

a := [5]int{1,2,3,4,5}
s1 := a[1:4] // [2,3,4]
s2 := a[2:5] // [3,4,5]
s1[0] = 10
fmt.Println(a) // [1,10,3,4,5]

⚠️ 修改切片元素会影响底层数组和其他共享切片。



切片的切片

切片可以继续切片:

s3 := s1[1:3] // 从 s1 中切出子切片

子切片仍然共享原数组

可以继续用 append 扩容



nil 切片与空切片

var s []int → nil 切片
s := []int{} → 空切片

两者长度为 0,但 nil 切片没有底层数组。



make 创建切片

s := make([]int, 5)      // 长度 5,容量 5
s2 := make([]int, 3, 10) // 长度 3,容量 10

make([]T, len, cap)
可预分配容量,提高性能



高级切片示例

s := []int{1,2,3}
s = append(s, 4,5,6...)
fmt.Println(s) // [1 2 3 4 5 6]

... 表示展开切片元素
常用于拼接两个切片


v2ray节点购买