Go语言切片

基本介绍

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.mzph.cn/news/828099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三招教你成为朋友圈运营高手,赶紧get起来!

朋友圈作为一个重要的营销推广渠道,是能够为我们带来很多收益的。今天就给大家分享朋友圈运营的三个技巧,快快Get起来吧! 第一招:明确人设定位 要在朋友圈里脱颖而出,首先我们需要明确自己的人设定位。选择一个与自己…

【Spring】IOC/DI中常用的注解@Order与@DependsOn

目录 1、Order 注解改变Bean自动注入的顺序 1.1、了解SpringBootTest注解 1.2、Order 注解改变Bean自动注入的顺序 2、DependsOn 改变Bean的创建顺序 1、Order 注解改变Bean自动注入的顺序 在sping中,通过IOC(控制反转)和DI(依…

文本向量化模型新突破——acge_text_embedding勇夺C-MTEB榜首

在人工智能的浪潮中,以GPT4、Claude3、Llama 3等大型语言模型(LLM)无疑是最引人注目的潮头。这些模型通过在海量数据上的预训练,学习到了丰富的语言知识和模式,展现了出惊人的能力。在支撑这些大型语言模型应用落地方面…

文件操作(1)

为什么使⽤⽂件? 如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的…

各平台奇怪问题备忘录

微信小程序 小程序报错Page 页面路径 has not been register yet 描述:uniapp做微信小程序开发时,新增某页面后,小程序跳转该页面报错Page 页面路径 has not been register yet 已知:page.json已添加该页面,小程序a…

B端设计实战:基于角色属性的权限设计

编辑导读:“权限控制”是中后台的基础能力,用于管控操作人员在平台内可做的事项内容。即通过权限控制,可以决定哪些人在平台内可以做哪些事。本文作者围绕角色&属性的权限设计展开分析,希望对你有帮助。 Hello,我是一名交互设计师。 随着3月暖春的即将到来,苏州的疫…

bugku-杂项-社工进阶收集

下载附件 得到图片 利用百度地图查找 这里得到地点名称大雁塔音乐喷泉 陕西省西安市,大雁塔北广场 打开高德地图 来到大雁塔北广场 因为在北广场,所以地铁站为大雁塔站 开始分析 坐七站到大雁塔站,即始发站为韦曲南站 因为始发站离她家800米&…

高频前端面试题汇总之HTML篇

1. src和href的区别 src和href都是用来引用外部的资源,它们的区别如下: src: 表示对资源的引用,它指向的内容会嵌入到当前标签所在的位置。src会将其指向的资源下载并应⽤到⽂档内,如请求js脚本。当浏览器解析到该元素…

34. BI - 美国大学生足球队的 GCN 案例

本文为 「茶桁的 AI 秘籍 - BI 篇 第 34 篇」 文章目录 美国大学生足球队 Embedding(GCN) Hi,你好。我是茶桁。 在上一节课中,因为需要,我们先是回顾了一下 Graph Embedding,然后跟大家讲解了 GCN 以及其算…

linux驱动-CCF-0基础

1. 时钟设备 晶振:提供基础时钟源的(可分为有源晶振、无源晶振两种); PLL: 用于倍频的锁相环; mux: 用于多路时钟源选择; Divider: 用于分频的; gate: 用于时钟使能的与门电路等 2. CCF…

Python读写文本URL蓝牙WIFI自动连接电子名片位置坐标智能海报等NDEF标签

本示例使用的发卡器:https://item.taobao.com/item.htm?id615391857885&spma1z10.5-c.w4002-21818769070.11.60ad789erlonvk 近场通信(Near Field Communication,简称NFC),是一种新兴的技术&…

技术速递|Java on Azure Tooling 3月更新 - Java on Azure 开发工具未来六个月路线图发布

作者:Jialuo Gan - Program Manager, Developer Division At Microsoft 排版:Alan Wang 大家好,欢迎阅读 Java on Azure 工具的三月更新。在本次更新中,我们将分享未来几个月对 Java on Azure 开发工具的投资。此外,我…

Redis入门到通关之数据结构解析-Dict

文章目录 概述构成Dict的扩容Dict的rehash总结 欢迎来到 请回答1024 的博客 🍓🍓🍓欢迎来到 请回答1024的博客 关于博主: 我是 请回答1024,一个追求数学与计算的边界、时间与空间的平衡,0与1的延伸的后端开…

SpringBoot引入第三方jar包或本地jar包

idea2018创建spring boot项目 New Project窗口选择Spring Initializr Type选择Maven(Generate…),有两个Maven选择这一个。 勾选Spring Web。 pom.xml中version改成2.5.10。 在resources中新建jar目录,将第三方jar包fastjson2-2.0.47.jar放入其中。&#xff08…

国产FTP文件传输服务器需要具备哪些关键特性?

国产FTP文件传输服务器是指根据中国国内信息技术创新(信创)的要求和标准,自主研发的文件传输服务器软件。这类软件旨在替代传统的FTP服务器,以更好地适应国产化和信息安全的需要。国产FTP文件传输服务器通常需要具备以下要求&…

【ensp】网关冗余vrrp实验

基础文字知识复习时,添加,下文仅拓扑以及核心配置以及结果分析 冗余路由器 核心代码: int g0/0/0 [R1-GigabitEthernet0/0/0]vrrp vrid 1 virtual-ip 192.168.10.1 ###设置虚拟ip [R1-GigabitEthernet0/0/0]vrrp vrid 1 priority 120 …

零碳家庭 “光”的力量

有行业专家乐观预测,在供给充足、基础设施建设与时俱进的情况下,2025年,我国新能源汽车市场的占有率将会达到50%,2030年更有望突破90%的大关。为了方便新能源汽车的出行,在家中安装一个智能充电桩是越来越多驾驶者的选…

分类预测 | Matlab实现RIME-BP霜冰优化BP神经网络多特征分类预测

分类预测 | Matlab实现RIME-BP霜冰优化BP神经网络多特征分类预测 目录 分类预测 | Matlab实现RIME-BP霜冰优化BP神经网络多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.RIME-BP霜冰优化BP神经网络多特征分类预测(Matlab实现完整源码和数据&a…

免杀技术之白加黑的攻击防御

一、介绍 1. 什么是白加黑 通俗的讲白加黑中的白就是指被杀软列入到可信任列表中的文件。比如说微软自带的系统文件或者一些有有效证书签名的文件,什么是微软文件,或者什么是有效签名文件在后面我们会提到他的辨别方法。黑就是指我们自己的文件,没有有…

【MCU】栈溢出问题

项目场景: 硬件:STM32F407,操作系统:rt_thread master分支 问题描述 问题栈溢出 id 499 ide 00 rtr 00 len 8 9 Function[rt_completion_wait] shall not be used in ISR (0) assertion failed at function:rt_completion_wait,…