Go 切片详解:make、append 与 copy 实战应用
引言
在 Go 语言中,切片(Slice)是动态数组的抽象实现,它提供了比数组更灵活的数据操作方式。切片不仅是 Go 语言中最常用的数据结构之一,也是理解 Go 内存管理的关键。本文将深入探讨切片的生成、追加、复制及删除操作,结合底层原理与实战案例,帮助开发者掌握切片的核心用法。
切片基础回顾
切片本质上是一个描述符结构体,包含三个字段:指向底层数组的指针、当前长度(len)和容量(cap)。
- 引用类型:切片变量本身存储的是元数据,实际数据存储在堆上的底层数组中。多个切片可以共享同一个底层数组。
- 空切片判断:推荐使用
len(s) == 0判断是否为空,而非s == nil。nil 切片表示未初始化,长度为 0;普通空切片已分配但长度为 0。 - 内存连续性:切片对应的底层数组必须是连续的内存空间,这保证了随机访问的高效性。
- 底层数组共享:当切片进行截取或传递时,如果新切片与原切片底层数组重叠,修改其中一个可能会影响另一个,需特别注意。
生成切片:make 函数
使用 make 函数可以创建指定类型、长度和容量的切片。这是初始化切片最常用的方法。
s1 := make([]int, 5, 10)
fmt.Printf("s1:%v len(s1):%d cap(s1):%d\n", s1, len(s1), cap(s1))
上述代码创建了一个长度为 5、容量为 10 的整型切片。前 5 个元素初始化为零值(0),后 5 个容量预留但未初始化。 若只指定长度,容量等于长度:
s2 := make([]string, 3)
// len=3, cap=3
若只指定容量(需配合后续赋值),通常用于预分配内存以减少扩容开销:
s3 := make([]byte, 0, 1024)
// len=0, cap=1024,适合循环追加
注意:make 返回的是切片类型,而非数组。对于数组,直接使用字面量或声明即可。
追加元素:append 函数
append 是内置函数,用于向切片末尾追加一个或多个元素。它是切片操作中最高频使用的函数之一。
基本用法
s1 := []string{"北京", "上海"}
s1 = append(s1, "广州")
// s1 变为 ["北京", "上海", "广州"]


