Golang 切片综合指南


Golang 切片综合指南文章插图
在这篇文章中 , 我们将复习「切片」的概念 , 它是 Golang 中一个重要的数据结构 , 这一数据结构为你提供了处理与管理数据集合的方法 。 切片是围绕着动态数组的概念构建的 , 它与动态数组相似 , 可以根据你的需要而伸缩 。

  • 就增长而言 , 切片是 动态 的 , 因为它们有自己的内置函数 append, 可以快速高效地增长切片 。
  • 你还可以通过切割底层内存来减少切片的大小 。
  • 在底层内存中切片是在连续的块上分配的 , 因此切片为你提供的便利之处包括:索引、迭代与垃圾回收优化 。
切片的表示
  • 切片不存储任何数据 , 它仅描述底层数组的一部分 。
  • 切片使用一个包含三个字段的结构表示:指向底层数组的指针(pointer)、长度(length)与容量(capacity) 。
  • 这个数据结构类似于切片的描述符 。

Golang 切片综合指南文章插图
  • 指针(Pointer): 指针用于指向数组的第一个元素 , 这个元素可以通过切片进行访问 。 在这里 , 指向的元素不必是数组的第一个元素 。
  • 长度(Length): 长度代表数组中所有元素的总数 。
  • 容量(Capacity): 容量表示切片可扩展的最大大小 。
使用长度声明一个切片在声明切片过程中 , 当你仅指定长度(Length)时 , 容量(Capacity)值与长度(Length)值相同 。
Golang 切片综合指南文章插图
// 使用长度声明一个切片 。 创建一个整型切片 。 // 长度和容量均为 5 。 slice := make([]int, 5)fmt.Println(len(slice)) // 打印结果 5fmt.Println(cap(slice)) // 打印结果 5使用长度和容量声明一个切片在声明切片过程中 , 当你分别指定长度(Length)和容量(Capacity)时 , 这将初始化一段无法访问的底层数组来创建一个具有可用容量的切片 。
/*使用长度和容量声明一个切片 创建一个整型切片 。长度为 3 , 容量为 5。 */slice := make([]int, 3, 5)fmt.Println(len(slice)) // 打印结果 3fmt.Println(cap(slice)) // 打印结果 5
Golang 切片综合指南文章插图
但请注意 , 尝试创建容量小于长度的切片是不允许的 。
使用切片字面量创建切片创建 切片 的惯用方法是使用 切片字面量。 它与创建数组相似 , 只是它不需要在 [ ] 操作符中指定值 。 你初始化切片时所用元素的数量将决定切片的初始长度与容量 。
// 创建字符串类型切片 。 // 长度与容量均为 5 。 slice := []string{"Red", "Blue", "Green", "Yellow", "Pink"} fmt.Println(len(slice)) // 打印结果 5fmt.Println(cap(slice)) // 打印结果 5// 创建一个整型切片 。 // 长度与容量均为 3 。 intSlice:= []int{10, 20, 30}fmt.Println(len(intSlice)) // 打印结果 3fmt.Println(cap(intSlice)) // 打印结果 3声明一个带有索引位置的切片当使用切片 字面量 时 , 你可以初始化切片的 长度 与 容量。 你所需要做的就是初始化表示所需长度和容量的 索引。 下面的语法将创建一个长度和容量均为 100 的切片 。
// 创建字符串类型切片 。 // 用空字符串初始化第 100 个元素 。 slice := []int{99: 88}fmt.Println(len(slice)) // 打印结果 100fmt.Println(cap(slice)) // 打印结果 100
Golang 切片综合指南文章插图
声明数组与切片的区别
  • 如果你使用 [ ] 操作符中指定一个值 , 那么你在创建一个数组 。
  • 如果你不在 [ ] 中指定值 , 则创建一个切片 。
// 创建一个包含 3 个整数的数组 。 array := [3]int{10, 20, 30} // 创建一个长度和容量均为 3 的整型切片 。 slice := []int{10, 20, 30}声明一个 nil 切片nil// 创建一个整型 nil 切片 。 var slice []int32fmt.Println(slice == nil) // 此行将打印 truefmt.Println(len(slice))// 此行将打印 0fmt.Println(cap(slice))// 此行将打印 0
Golang 切片综合指南文章插图
声明一个空切片还可以通过初始化声明切片创建一个空切片 。
// 使用 make 来创建一个整型空切片 。 sliceOne := make([]int, 0)// 使用切片字面量创建一个整型空切片 。 sliceTwo := []int{}fmt.Println(sliceOne == nil) // 这将打印 falsefmt.Println(len(sliceOne))// 这将打印 0 fmt.Println(cap(sliceOne))// 这将打印 0fmt.Println(sliceTwo == nil) // 这将打印 falsefmt.Println(len(sliceTwo))// 这将打印 0fmt.Println(cap(sliceTwo))// 这将打印 0