Golang 切片综合指南( 三 )

将数值 35 分配给 newSlice 的第二个元素后 , 该更改也可以在原始切片的元素中被看到 。
运行时错误显示索引超出范围一个切片只能访问它长度以内的索引位 。 尝试访问超出长度的索引位元素将引发一个运行时错误 。 与切片容量相关联的元素只能用于切片增长 。
// 创建一个整型切片 。 // 长度和容量均为 5 。 slice := []int{10, 20, 30, 40, 50}// 创建一个新的切片 。 // 长度为 2 , 容量为 4 。 newSlice := slice[1:3]// 变更 newSlice 索引 3 位置的元素 。 // 对于 newSlice 而言 , 该元素不存在 。 newSlice[3] = 45/*Runtime Exception:panic: runtime error: index out of range*/切片增长与使用数组相比 , 使用切片的优势之一是:你可以根据需要增加切片的容量 。 当你使用内置函数 「append」 时 , Golang 会负责处理所有操作细节 。

  • 使用 append 前 , 你需要一个源 切片 和一个要追加的值 。
  • 当你的 append 调用并返回时 , 它将为你提供一个更改后的新切片 。
  • append 函数总会增加新切片的长度 。
  • 另一方面 , 容量可能会受到影响 , 也可能不会受到影响 , 这取决于源切片的可用容量 。
使用 append 向切片追加元素/* 创建一个整型切片 。长度和容量均为 5 。*/slice := []int{10, 20, 30, 40, 50}/* 创建一个新切片 。长度为 2 , 容量为 4 。 */newSlice := slice[1:3]fmt.Println(len(newSlice)) // 打印 2fmt.Println(cap(newSlice)) // 打印 4/* 向容量空间分配新元素 。将值 60 分配给新元素 。*/newSlice = append(newSlice, 60)fmt.Println(len(newSlice)) // 打印 3fmt.Println(cap(newSlice)) // 打印 4当切片的底层数组没有可用容量时 , append 函数将创建一个新的底层数组 , 拷贝正在引用的现有值 , 然后再分配新值 。
使用 append 增加切片的长度和容量// 创建一个整型切片 。 // 长度和容量均为 4 。 slice := []int{10, 20, 30, 40}fmt.Println(len(slice)) // 打印 4fmt.Println(cap(slice)) // 打印 4// 向切片追加新元素 。 // 将值 50 分配给新元素 。 newSlice= append(slice, 50)fmt.Println(len(newSlice)) // 打印 5fmt.Println(cap(newSlice)) // 打印 8
Golang 切片综合指南文章插图
在 append 操作后 , newSlice 被给予一个自有的底层数组 , 该底层数组的容量是原底层数组容量的两倍 。 在增加底层数组容量时 , append 操作十分聪明 。 举个例子 , 当切片的容量低于 1,000 个元素时 , 容量增长总是翻倍的 。 一旦元素的数量超过 1,000 个 , 容量就会增长 1.25 倍 , 即 25% 。 随着时间的推移 , 这种增长算法可能会在 Golang 中发生变化 。
更改新切片不会对旧切片产生任何影响 , 因为新切片现在有一个不同的底层数组 , 它的指针指向一个新分配的数组 。
将一个切片追加到另一个切片中内置函数 append 还是一个 可变参数 函数 。 这意味着你可以传递多个值来追加到单个切片中 。 如果你使用 … 运算符 , 可以将一个切片的所有元素追加到另一个切片中 。
// 创建两个切片 , 使用两个整型元素初始化每个切片 。 slice1:= []int{1, 2}slice2 := []int{3, 4}// 合并两个切片并打印结果 。 fmt.Println(append(slice1, slice2...))// 输出:[1 2 3 4]对切片执行索引a[low:high]a := [...]int{0, 1, 2, 3} // 一个数组s := a[1:3]// s == []int{1, 2}// cap(s) == 3s = a[:2]// s == []int{0, 1}// cap(s) == 4s = a[2:]// s == []int{2, 3}// cap(s) == 2s = a[:]// s == []int{0, 1, 2, 3}// cap(s) == 4