首页 > 其他分享 >Go 语言学习笔记之数组与切片

Go 语言学习笔记之数组与切片

时间:2024-06-03 10:00:16浏览次数:22  
标签:容量 笔记 切片 len 数组 Go 长度 底层

大家好,我是码农先森。

数组与切片的区别

在 Go 语言中,数组和切片是两种不同的数据结构,它们之间有以下主要区别。

参数长度:
数组(Array):数组的长度是固定的,在创建时就需要指定数组的长度,无法动态改变;只有长度信息,通过 len() 函数获取。
切片(Slice):切片是对数组的一个引用,底层使用的是数组的数据结构,具有动态长度,可以动态增加或减少元素,实现动态扩容;有长度和容量信息,通过 len()cap() 函数可以获取。

参数传递:
数组:在函数间传递数组会进行值拷贝,较大的数组会导致性能开销。
切片:切片是对底层数组的引用,传递切片时只是传递引用,并不会复制整个数组,节省内存和性能。

切片的扩容

当一个切片通过切片操作(如 appendcopyslicing 等)对底层数组进行修改时,如果底层数组容量不足,会创建一个新的底层数组,并将数据复制到新的底层数组中,此时切片会指向新的底层数组。

追加一个元素时,如果切片的容量能够容纳新增元素,即切片的长度小于容量,那么切片的长度会增加 1,容量不变。
但如果超出了当前容量,即切片的长度等于容量,那么会触发切片的扩容,根据倍增规则重新分配底层数组,当原切片的长度大于或等于 1024 时,会以原容量的 1.25 倍作为新容量的基准;通过下面的例子和图解可以更加具体的了解扩容的过程。

// 长度与容量相等
func TestSlice(t *testing.T) {
	var a []int
	fmt.Printf("%v, %v\n", len(a), cap(a)) // 0, 0
	a = append(a, 1)
	a = append(a, 2)
	fmt.Printf("%v, %v\n", len(a), cap(a)) // 2, 2
}

// 当元素的个数超过 1024 长度,则会以 (1280 / 1025) = 1.25 倍进行扩容
func TestSlice(t *testing.T) {
	var a []int
	fmt.Printf("%v, %v\n", len(a), cap(a)) // 0, 0
	i := 1
	for i <= 1025 {
		a = append(a, i)
		i += 1
	}
	fmt.Printf("%v, %v\n", len(a), cap(a)) // 1025, 1280
}

总结

我们了解了数组和切片之间的关系。切片是基于数组的,可变长的,并且操作快。一个切片的容量总是固定的,而且一个切片也只会与某一个底层数组关联。切片的扩容是根据倍增规则重新分配了底层的数组,如果频繁的动态扩容,可能会带来一些性能开销。因此,在对性能有严格要求的场景下,尽量提前估算切片所需的容量,避免频繁的动态扩容。

欢迎关注、分享、点赞、收藏、在看,我是码农先森。

标签:容量,笔记,切片,len,数组,Go,长度,底层
From: https://www.cnblogs.com/yxhblogs/p/18181131

相关文章

  • 数据结构复习笔记5.1:树
            之前,我们介绍的所有的数据结构都是线性存储结构。本章,我们所介绍的树的结构是⼀种⾮线性的存储结构。存储的是具有⼀对多的关系的数据元素的集合。1.树的定义树是由n(n>=0)个结点组成的有限集,n=0时为空树,且对于非空树:有且仅有一个特定的称为根的结点;当n>1......
  • 《Linux内核完全注释》学习笔记:2.5 Linux内核对内存的使用方法
    在Linux0.11内核中,为了有效地使用机器中的物理内存,内存被划分成几个功能区域,如图2-9所示。图2-9物理内存使用的功能区域分布图Linux内核程序占据在物理内存的开始部分,接下来是用于供硬盘或软盘等块设备使用的高速缓冲区部分。当一个进程需要读取块设备中的数据时,系统会......
  • 【YOLOv8改进】D-LKA Attention:可变形大核注意力 (论文笔记+引入代码)
    摘要医学图像分割在Transformer模型的应用下取得了显著进步,这些模型在捕捉远距离上下文和全局语境信息方面表现出色。然而,这些模型的计算需求随着token数量的平方增加,限制了其深度和分辨率能力。大多数现有方法以逐片处理三维体积图像数据(称为伪3D),这忽略了重要的片间信息,从而降低......
  • Go语言编程快速入门
    Go语言编程快速入门这个是学习B站杨旭视频做的记录,地址安装https://studygolang.com/VsCode安装Go插件ctrl+shift+p:输入go查询,选择Install/UpdateTools,全部勾选,点击OKGo代理(执行命令后重启vscode)#控制台执行命令goenv-wGO111MODULE=ongoenv-wGOPROXY=htt......
  • Uncovering ChatGPT’s Capabilities in Recommender Systems论文阅读笔记
    UncoveringChatGPT’sCapabilitiesinRecommenderSystems论文阅读笔记Abstract​ 在本研究中,我们的目标是通过将ChatGPT的推荐能力与传统的信息检索(IR)排名能力对齐,包括点排序、成对排序和列表排序。为了实现这一目标,我们将上述三种建议策略重新制定为专门针对现有领域而定制......
  • 05构建之法阅读笔记之一
    作品概述:《构建之法:大道至简》是一部深入探讨如何在建筑设计与规划中追求简约之道的著作。作者通过对历史上各种建筑形式和理念的分析,提出了在当今复杂社会背景下,如何通过简化设计和构建过程,实现建筑作品的优雅与实用的理念。主题探索:简约与功能的平衡:本书着重探讨了在建筑......
  • 06构建之法阅读笔记之一
    这次个人阅读选择的书籍为《构建之法:现代软件工程》(邹欣著)。我们这门课程也参考了很多这本书的结构、内容与方法,读这本书,既是对学过知识的复习和细化,也是对以后课程的预习。下面总结了几个阅读过程中理解有困难或疑问的point,有的是细节,有的是大的方法。然后在网上查找学习了......
  • 02梦断代码阅读笔记之一
    《梦断代码》阅读笔记作品概述:《梦断代码》是中国知名科幻作家刘慈欣的代表作之一,于2008年问世。这部小说探讨了虚拟现实、人工智能等科技元素与人类情感、自由、道德之间的交织关系,以及科技可能给人类社会带来的影响和挑战。通过对未来世界的设想和对人类内心的深刻挖掘,小说引......
  • 03大道至简阅读笔记之一
    这本书和我们的渊源还是很深的,刚上大二的时候老师就一直给我们传播这个思想——大道至简。不过之前一直没有看这本书,这次一个学期看三本,也终于找到机会拜读这本被誉为“激荡新思的佳作”的《大道至简》了。 在学习任何实物之前,我们都要了解此事务的思想,因为思想对客观事物......
  • 04大道至简阅读笔记之一
    《大道至简》阅读笔记作品概述:《大道至简》是一部深刻探讨简约生活哲学的著作,旨在引导人们通过简化生活、减少物质负担和精神压力,实现更高质量的生活。作者认为,简约并非削减一切,而是寻求内在与外在的平衡,以达到心灵与生活的和谐。主题探索:简约的价值观:《大道至简》探讨了简......