Go语言切片

server/2024/10/18 9:24:21/

基本介绍

Go 语言切片是对数组的抽象,是一种长度可变的动态数组。

基本用法

切片声明

声明一个未指定大小的数组来定义切片

	var s []int

或者使用 make 函数来创建切片

	var slice1 []type = make([]type, len)// 使用简短声明slice1 := make([]type, len)

切片初始化

直接初始化切片,不用像数组一样指定长度

	s := []int {1,2,3} 

引用一个数组

	arr := [3]int{1,2,3}s := arr[:]

引用部分数组

	arr := [3]int{1,2,3}s := arr[1:2]

引用一个切片

	s1 := []int{1,2,3,4,5}s2 := s1[:]

len 和 cap

len :获取切片元素的数量

	s1 := []int{1,2,3,4,5}fmt.Println(len(s1)) // 输出 5

cap :获取切片元素的容量

	s1 := []int{1,2,3,4,5}fmt.Println(cap(s1)) // 输出 5

切片截取

切片截取规则

  1. 截取规则由起始位置和结束位置组成,中间用冒号隔开
  2. 起始位置和结束位置可以省略不写,不写则代表开头或者结尾
  3. 截取元素包含起始位置的元素,但是不包含结束位置的元素
  4. 起始位置和结束位置必须不能是负数
  5. 结束位置要大于等于起始位置
	// 获取全部元素fmt.Println(slice1[:])// [1 2 3 4 5 6 7 8 9]// 获取从下标为 0 元素到下标为 7 的元素,不包含最后的元素fmt.Println(slice1[:7])// [1 2 3 4 5 6 7]// 获取从下标为 2 的元素开始,到结尾fmt.Println(slice1[2:])// [3 4 5 6 7 8 9]// 获取从下标为 4 元素到下标为 6 的元素fmt.Println(slice1[4:6])// [5 6]

append 函数

切片初始化之后,可以使用 append 函数向切片中追加元素

  1. 可以一次追加一个元素
  2. 也可以一次追加多个元素
  3. 也可以追加整个切片,切片后面使用…
	// 追加一个元素slice2 := []int{1,2,3,4,5}slice2 = append(slice2,6)fmt.Println(slice2)// [1 2 3 4 5 6]// 追加多个元素slice2 = append(slice2,7,8,9)fmt.Println(slice2)// [1 2 3 4 5 6 7 8 9]// 追加一个切片slice3 := []int{1,2,3}slice2 = append(slice2,slice3...)// [1 2 3 4 5 6 7 8 9 1 2 3]

copy 函数

由于切片是引用类型,如果简单赋值给一个变量,两者其实还是指向相同的底层数组,这时可以使用copy 函数可以将一个切片复制给另外一个切片。

	slice4 := []int{1,2,3}slice6 := make([]int,3)slice5 := slice4copy(slice6,slice4)slice4[0] = 3fmt.Println(slice5)//[3 2 3]fmt.Println(slice6)//[1 2 3]
  1. 从上面的 demo 可以看出来直接赋值后的 slice5 因为 slice4 改变,自己也改变
  2. 而 slice6 还是保持自己原有的值,表示他和 slice4 指向不同的底层数组
  3. 使用 copy 的切片一定是要初始化过的或者使用 make 之后的,要不然无法复制

自动扩容

每次使用 append 函数给切片添加元素的时候,Go 为了减少内存分配次数,会进行扩容判断,如果当前容量够用,则不进行扩容,如果超出目前容量则将容量进行翻倍。

	slice7 := []int{1,2,3}fmt.Println(cap(slice7)) // 3slice7 = append(slice7,4)fmt.Println(cap(slice7))// 6slice7 = append(slice7,5)fmt.Println(cap(slice7))// 6slice7 = append(slice7,6)fmt.Println(cap(slice7))// 6slice7 = append(slice7,7)fmt.Println(cap(slice7))// 12

根据 demo 我们可以清晰看到切片的容量情况,不过 Go 也不是一味的进行翻倍操作,根据不同的版本有不同的策略。

End

好了,这就是 Go 切片的一些基本知识和基本用法了。


http://www.ppmy.cn/server/13486.html

相关文章

TCP传输的粘包问题和各种异常情况

文章目录 粘包问题用分隔符用数字代表长度 TCP传输可能遇到的异常情况进程终止电脑关机正常情况下关机非正常情况关机(停电)电脑断网 粘包问题 粘包问题其实并不是TCP独有的的问题而是每一个面向字节流都会出现的问题,那么什么是粘包问题呢&…

深入理解Java NIO:原理、应用与实战详解

深入理解Java NIO:原理、应用与实战详解 引言 在现代软件开发中,高效的数据处理能力往往是决定系统性能的关键因素之一。Java NIO(New Input/Output)作为Java平台对非阻塞I/O模型的重要支持,为开发者提供了强大的网络…

ChatGPT研究论文提示词集合2-【形成假设、设计研究方法】

点击下方▼▼▼▼链接直达AIPaperPass ! AIPaperPass - AI论文写作指导平台 目录 1.形成假设 2.设计研究方法 3.书籍介绍 AIPaperPass智能论文写作平台 近期小编按照学术论文的流程,精心准备一套学术研究各个流程的提示词集合。总共14个步骤&#…

7.MMD 法线贴图的设置与调教

前期准备 人物 导入温迪模型导入ray.x和ray_controler.pmx导入天空盒time of day调成模型绘制顺序,将天空盒调到最上方给温迪模型添加main.fx材质在自发光一栏,给天空盒添加time of lighting材质 打开材质里的衣服,发现只有一个衣服文件 …

什么是 GitHub Wiki 以及如何使用它?

GitHub Wiki 是你项目文档的一个很好的地方。你可以使用 wiki 来创建、管理和托管你的存储库的文档,以便其他人可以使用并为你的项目做出贡献。 GitHub Wiki 很容易开始使用,无需安装任何其他软件。最好的部分是 wiki 与你的 GitHub 存储库集成在一起。…

Mac 安装comfigUI (M1)

注:系统要升到最新的 (Xcode 13.3.1 or later) Requirements Mac computers with Apple silicon or AMD GPUsmacOS 12.3 or laterPython 3.7 or laterXcode command-line tools: xcode-select --install 安装 pytorch 查看这个内容安装 h…

上网行为管理软件有哪些?三款常用上网行为管理软件评测

互联网的普及,企业和个人对于网络安全和信息保护的需求越来越高。为了确保网络环境的安全和稳定,上网行为管理软件应运而生。本文将对三款常用的上网行为管理软件进行评测,分别是域智盾、Splunk Enterprise Security和安企神。 1、域智盾 域…

python之面向对象

目录 1. 面向对象和面向过程思想 2. 类和对象 3. 类的组成 3.1. 成员属性 3.2 成员属性 3.2 成员方法 4. 特殊方法和参数 4.1 成员方法的self参数 4.2 __init__方法 4.3 __str__方法 5. 私有化 5.1 属性私有化 5.2 方法私有化 1. 面向对象和面向过程思想 面向对象…