3.2 切片

本篇学习 Go 切片的创建、追加与截取,并能完成动态序列的常见操作。

字数 798 字

切片

概念说明

切片(Slice)是对底层数组的一个连续片段视图。
和数组相比,切片长度可变,更适合日常开发中的动态数据场景。
在 Go 中,切片是最常用的序列类型。

语法/规则

  1. 切片类型写法是 []T,例如 []int[]string
  2. 零值切片是 nillencap 都是 0
  3. make([]T, len, cap) 用于创建切片,cap 可省略(默认等于 len)。
  4. append 可能返回新的底层数组,因此通常要写成 s = append(s, x)
  5. 切片表达式 a[low:high] 左闭右开,包含 low,不包含 high

追加与修改元素示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package main

import "fmt"

func main() {
	list := []string{}

	list = append(list, "阿斌")
	list = append(list, "知道")
	fmt.Println(list)
	fmt.Println(len(list))

	list[1] = "不知道"
	fmt.Println(list)
}

输出结果:

1
2
3
[阿斌 知道]
2
[阿斌 不知道]

make 与切片表达式示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package main

import "fmt"

func main() {
	var a []int
	b := make([]int, 2, 4)
	b[0], b[1] = 10, 20

	base := [5]int{10, 20, 30, 40, 50}
	part := base[1:4]

	fmt.Println(a == nil, len(a), cap(a))
	fmt.Println(b == nil, len(b), cap(b), b)
	fmt.Println(part, len(part), cap(part))
}

输出结果:

1
2
3
true 0 0
false 2 4 [10 20]
[20 30 40] 3 4

make 解析

b := make([]int, 2, 4) 里,make 会创建并初始化一个可直接使用的切片。

  1. []int 是切片类型。
  2. 2 是长度 len,表示当前能直接通过索引访问的元素个数。
  3. 4 是容量 cap,表示底层数组当前最多可容纳的元素个数。

这种写法适合你预估元素数量的场景,通常能减少 append 触发扩容的次数。

如果你想进一步了解 make 在 map、channel 上的写法,可以查看 make 详解

切片排序示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package main

import (
	"fmt"
	"sort"
)

func main() {
	nums := []int{4, 5, 3, 2, 7}

	sort.Ints(nums)
	fmt.Println("升序:", nums)

	sort.Sort(sort.Reverse(sort.IntSlice(nums)))
	fmt.Println("降序:", nums)
}

输出结果:

1
2
升序: [2 3 4 5 7]
降序: [7 5 4 3 2]

常见错误

  1. 对空切片直接按索引赋值(如 list[0] = "x")会触发 index out of range
  2. 调用 append 后不接收返回值,可能导致新增元素没有保存到目标切片。
  3. 切片边界写错(如 a[3:2] 或超过长度)会在运行时 panic。
  4. 排序示例忘记导入 sort 包会导致编译失败。
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
载入天数...载入时分秒...
发表了 0 篇文章 · 发表了 46 篇笔记 · 总计 2 万 5 千字(其中笔记 25104 字)