在Go语言的世界里,切片就像是一双无限伸缩的数据手套,让你优雅地掌控动态数据集合。
01 切片基础:为何它比数组更受欢迎?
在Go语言中,数组是一个固定长度的序列,而切片则是对底层数组的动态引用。可以把切片想象成一个可以自动扩缩容的智能数组,它知道当前使用了多少空间,还有多少空间可供使用。
切片的数据结构包含三个关键字段:指向底层数组的指针、切片的长度(当前元素数量)和切片的容量(从切片起始位置到底层数组末尾的元素数量)。
简单来说,长度表示切片当前有多少元素,容量表示切片最大可以容纳多少元素,容量永远大于或等于长度。
与数组不同,切片是引用类型,这意味着当你将一个切片赋值给另一个变量时,两个变量会引用同一个底层数组。这种设计极大地提高了数据传递的效率,特别是在处理大量数据时。
那么,在实际编程中如何创建和使用切片呢?让我们一起来探索几种常见的方法。
02 创建切片:多种方法任你选择
Go语言提供了多种创建切片的方式,每种方法都有其适用场景。
直接声明切片
最简单的方式是直接声明一个切片:
var slice []int
fmt.Printf("长度:%d\n", len(slice)) // 0
fmt.Printf("容量:%d\n", cap(slice)) // 0
fmt.Println(slice) // []
这种方式只是声明了切片,并未初始化,slice的值为nil。在实际使用前,你需要使用append函数添加元素或使用make函数分配空间。
使用make函数创建切片
make函数是创建切片的常用方法,它允许你指定切片的初始长度和容量:
// 创建一个长度为3,容量为5的整数切片
slice := make([]int, 3, 5)
fmt.Printf("slice=%v, len=%d, cap=%d\n", slice, len(slice), cap(slice))
// 输出:slice=[0 0 0], len=3, cap=5
如果省略容量参数,容量会默认与长度相同:
slice := make([]int, 5)
fmt.Printf("长度:%d, 容量:%d\n", len(slice), cap(slice))
// 输出:长度:5, 容量:5
使用make函数创建切片时,系统会自动初始化所有元素为类型的零值,这对于后续操作非常安全。
使用切片字面量创建
当你已经知道切片的初始元素时,可以使用切片字面量直接创建:
slice := []int{1, 2, 3, 4, 5}
fmt.Printf("长度:%d, 容量:%d, 值:%v\n", len(slice), cap(slice), slice)
// 输出:长度:5, 容量:5, 值:[1 2 3 4 5]
这种方式既直观又简洁,是代码中最常见的切片创建方式之一。
从数组或现有切片创建
通过“切片”操作可以从数组或现有切片创建新切片:
arr := [10]int{0, 23, 14, 56, 89, 65, 32, 14, 10, 23}
slice1 := arr[0:5] // 包含元素0到4
slice2 := arr[:3] // 包含元素0到2
slice3 := arr[7:] // 包含元素7到9
slice4 := arr[:] // 包含所有元素
fmt.Printf("slice1: %v\n", slice1) // [0 23 14 56 89]
fmt.Printf("slice2: %v\n", slice2) // [0 23 14]
fmt.Printf("slice3: %v\n", slice3) // [14 10 23]
fmt.Printf("slice4: %v\n", slice4) // [0 23 14 56 89 6

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



