golang学习笔记:切片 | 青训营

184 阅读2分钟

1. 切片简介

在Golang中,切片(Slice)是一种重要的数据结构,用于存储具有相同类型的可变长度序列。切片提供了对数组的抽象,并提供了更便捷的操作和功能。相比数组,切片的长度可以动态增长或缩小,使其成为处理动态数据集合的理想选择。

2. 创建切片

创建一个切片可以使用内置的make()函数,或者使用切片字面量。下面是两种常见的创建切片的方法:

使用make()函数创建切片:

slice := make([]int, 0) // 创建一个空的整型切片

使用切片字面量创建切片:

slice := []string{"apple", "banana", "orange"}

3. 切片的基本操作

添加元素

使用内置的append()函数可以向切片中添加元素:

slice := make([]int, 0)
slice = append(slice, 10) // 添加一个元素

访问元素

切片的元素可以通过索引进行访问,索引从0开始:

slice := []string{"apple", "banana", "orange"}
fmt.Println(slice[0]) // 输出: "apple"

切片的长度和容量

切片的长度表示当前切片中元素的数量,可以使用len()函数获取。切片的容量表示切片底层数组的大小,可以使用cap()函数获取。

slice := make([]int, 3, 5)
fmt.Println(len(slice)) // 输出: 3
fmt.Println(cap(slice)) // 输出: 5

切片的切割

通过切割操作,我们可以获取切片的子集:

slice := []int{1, 2, 3, 4, 5}
subSlice := slice[1:3] // 获取索引1到2的子切片,包含起始索引,不包含结束索引
fmt.Println(subSlice) // 输出: [2 3]

4. 切片的底层原理

切片是通过指针、长度和容量来描述底层数组的片段。当切片作为函数参数传递时,实际上传递的是指向底层数组的指针,因此对切片的修改会影响到原始数组和其他引用该数组的切片。

5. 切片的扩容

当切片的容量不足以容纳新添加的元素时,切片会自动进行扩容。切片的扩容机制是通过创建一个新的更大的底层数组,将现有元素复制到新数组,并返回新数组对应的切片。

6. 切片的注意事项

  • 切片是引用类型,当传递切片给函数或赋值给其他变量时,它们都引用相同的底层数组。
  • 使用copy()函数可以复制切片的内容到一个新的切片,避免共享底层数组。

7. 总结

Golang中的切片是一种强大的数据结构,可以方便地处理动态长度的数据集合。通过掌握切片的创建、操作和底层原理,我们可以更有效地使用切片来构建高效的程序。