终于掌握append为切片添加元素的诀窍 切片动态增长看这里

简介: 终于掌握append为切片添加元素的诀窍 切片动态增长看这里

append()方法是为切片动态添加元素的常用方式。合理利用 append 可以极大地提高切片的便利性,实现动态增长数组的效果。

本文将详细介绍 append 的定义规范、切片扩容机制、append 多个元素、copy 与 append 结合使用等,并辅以具体代码示例,以帮助读者全面掌握 append 为切片添加元素的各种用法。

1

 

一、append 方法

append 方法的定义是:

func append(slice []T, elems ...T) []T

它可以为切片动态添加一个或多个元素。

2

 

二、切片扩容

当切片容量不够时,append 会自动扩容:

slice := []int{1, 2}
slice = append(slice, 3) // 触发扩容

这让切片可以动态增长,不需要手动扩容。

3

 

三、一次 append 多个

append 支持同时追加多个元素:

slice = append(slice, 1, 2, 3)

这样可以避免多次调用带来的性能损耗。

4

 

四、扩容策略

当超过 1024 个元素时,扩容变成 1.25 倍,否则是 2 倍。

func main() {
  slice := make([]int, 0, 1)
  // 起始len=0, cap=1
  for i := 0; i < 1024; i++ {
    slice = append(slice, i)
  }
  // len=1024, cap=1024
  fmt.Println(len(slice), cap(slice)) 
  // 1024 1024
  slice = append(slice, 2048)
  // 超过1024个元素,cap变成1.25倍
  fmt.Println(len(slice), cap(slice))
  // 1025 1280
}

这个示例中,起始切片容量为 1。当元素个数达到 1024 时,容量也是 1024。当再次 append 时,由于元素超过 1024,容量变成了 1280,也就是 1.25 倍。如果不足 1024 时,扩容策略是 2 倍容量。

5

 

五、与 copy 结合

可以通过 copy 使切片扩容后拷贝原数据:

func ExpandSlice(slice []int) []int {
  newSlice := append(slice, 0)
  copy(newSlice, slice)
  return newSlice 
}

这在修改切片时保留原数据很有用。

6

 

六、 append 初始化切片

append 一个 nil 切片将初始化切片:

var slice []int
slice = append(slice, 1)

7

 

总结

append 为切片添加元素非常高效方便,合理利用可以大大提升切片编程效率。


目录
相关文章
|
存储 容器
List,linkeedlist集合介绍,特点,二者区别,增长因子,去重复
List,linkeedlist集合介绍,特点,二者区别,增长因子,去重复
|
8月前
|
存储 算法
轮转数组问题:如何实现数组“整体逆序,内部有序”?“三步转换法”妙转数组(一)
这篇内容讲述了数组向右轮转k个位置的问题,主要分为两种解决思路。第一种是“轮转k次法”,直接在原数组上操作,每次循环k次,将数组末尾元素移到开头,时间复杂度为O(N*K),效率较低。第二种是“额外数组法”,使用额外数组存储部分元素,然后移动原数组元素,最后归还额外数组元素,时间复杂度和空间复杂度均为O(N)。文章还介绍了更高效的“三步转换法”,通过三次逆序操作实现数组轮转,分别是逆置后k个元素、逆置前n-k个元素以及整体逆置,这种方法时间复杂度为O(N)且空间复杂度为O(1)。
90 1
|
8月前
|
索引 Python
索引、切片和迭代
【5月更文挑战第6天】 索引、切片和迭代。
34 1
|
8月前
|
C语言
轮转数组问题:如何实现数组“整体逆序,内部有序”?“三步转换法”妙转数组 (二)
这是一个关于字符串处理的问题,要求将一句话中的单词顺序倒置,但保持单词内部的字符顺序不变。例如,"I like beijing." 变为 "beijing. like I"。解决方法可以分为三个步骤:分块、内部逆序和整体逆序。代码示例使用C语言实现,通过指针和while循环操作字符串数组。最终总结提到,无论先逆置哪个部分,只要确保所有部分都逆置过,结果都是相同的。
62 0
|
8月前
【全网最简短代码】筛选出新数组中和旧数组的重复项,并和旧数组合并(往数组追加新的数据对象且去重,合并两个数组不重复数据)
【全网最简短代码】筛选出新数组中和旧数组的重复项,并和旧数组合并(往数组追加新的数据对象且去重,合并两个数组不重复数据)
|
算法 测试技术 C#
C++二分查找算法:数组中占绝大多数的元素
C++二分查找算法:数组中占绝大多数的元素
|
存储
学C的第二十三天【继续深度剖析数据在内存中的存储:3. 浮点型在内存中的存储(重点);练习:1. 有序序列判断;2. 获得月份天数(多组输入);3. 使用指针打印数组内容;4. 使用指针使字符串逆序】-2
(4). 取出内存中的 指数E(三种情况):E全为1 指数E 是通过 真实值+中间值 算出来的,如果E全是1,(32位系统)说明E的真实值是 128,指数是128说明这个值是非常大的。 这时,如果 有效数字M 全为0,表示 ±无穷大(正负取决于符号位s)
重生之我是孔乙己——查找数组缺失元素的几种方法
重生之我是孔乙己——查找数组缺失元素的几种方法
85 0

热门文章

最新文章