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

大家好,我是码农先森。

数组与切片的区别

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

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

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

切片的扩容

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

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

// 长度与容量相等
func TestSlice(t *testing.T) {var a []intfmt.Printf("%v, %v\n", len(a), cap(a)) // 0, 0a = 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 []intfmt.Printf("%v, %v\n", len(a), cap(a)) // 0, 0i := 1for i <= 1025 {a = append(a, i)i += 1}fmt.Printf("%v, %v\n", len(a), cap(a)) // 1025, 1280
}

总结

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

欢迎关注、分享、点赞、收藏、在看,我是微信公众号「码农先森」作者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/32788.shtml

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

相关文章

微信小程序学习(十三):mobx-miniprogram和miniprogram-computed

1、mobx-miniprogram 1.1 介绍 mobx-miniprogram 是针对微信小程序开发的一个简单、高效、轻量级状态管理库&#xff0c;它基于Mobx状态管理框架实现。 使用 mobx-miniprogram 定义管理的状态是响应式的&#xff0c;当状态一旦它改变&#xff0c;所有关联组件都会自动更新相…

图片覆盖攻击

点击劫持的本质是一种视觉欺骗。顺着这个思路&#xff0c;还有一些攻击方法也可以起到类似的作 用&#xff0c;比如图片覆盖。 一名叫 sven.vetsch 的安全研究者最先提出了这种 Cross Site Image Overlaying 攻击&#xff0c;简称 XSIO。sven.vetsch 通过调整图片的 style 使得…

DVWA-XSS(Stored)-beef

用Low Level来测试beef的使用 beef配置 如果kali没有beef的&#xff0c;进行下载 apt install beef-xss使用 beef-xss # 命令方式启动 beef-xss-stop # 命令方式关闭 systemctl start beef-xss.service #开启beefsystemctl stop beef-xss.service #关闭…

前端 CSS 经典:backface-visibility 属性

前言&#xff1a;backface-visibility 属性可以使反转 180deg 的元素隐藏&#xff0c;使用这个属性实现卡片翻转效果 效果 代码实现 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><meta http-equiv"X-…

记MySQL事务+消息队列引起的问题

问题描述&#xff1a; 先说一下流程&#xff1a;后端保存前端提交的图表信息&#xff0c;然后发送异步消息到消息队列&#xff0c;由下游服务去处理图表信息。 部署项目到服务器&#xff0c;验证项目功能的时候&#xff0c;出现了以下错误&#xff1a;数据库存在数据。下游服…

C++ 音视频传输

目录 一、概述 二、音视频采集 1、视频采集 2、音频采集 三、音视频编码 四、网络传输 五、音视频解码 六、音视频播放 1、视频播放 2、音频播放 七、音视频同步 1. 时间戳管理 2. 缓冲控制 3. 同步策略 3.1 视频为主 3.2 音频为主 3.3 同步点策略 3.4 缓冲区…

Spring Boot+vue社区养老系统(智慧养老平台)

使用技术&#xff1a; springbootvueMySQL 主要功能&#xff1a; 管理员 登录个人资料密码管理, 用户管理:床位类型管理,床位管理,护工管理,老人管理 咨询登记管理&#xff0c;预约登记管理,老人健康信 息管理,费用管理等功能.护工角色包含以下功能: 护工登录&#xff0c;个…

Elastaticsearch与SpringBoot集成的互联网的实战分享

以前有过类似的文章&#xff0c;今天升级版分享重磅内容&#xff0c;Elastaticsearch与SpringBoot集成的互联网的实战。 一、需求分析&#xff1a; 起因是这样的&#xff0c;产品有这样一个需求&#xff1a;数据中的标题、内容、关键词等实现结构化搜索和半结构化搜索、数据时…

自2008年金融危机以来首次,欧洲AAA级CMBS投资者面临亏损

在欧洲预期损失之前&#xff0c;美国AAA级CMBS投资者已经遭受了打击。即便是最高信用等级的投资也不再安全&#xff0c;全球金融系统可能存在一些严重的问题。 历史罕见&#xff0c;最安全的AAA级债权人&#xff0c;在没有发生经济危机的情况下&#xff0c;出现了损失&#xff…

外排序(C语言实现)

前言 本篇博客讲解一下外排序&#xff0c;看这篇排序你的先去看一下&#xff1a;八大经典排序算法-CSDN博客 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;排序_普通young man的博客-CSDN博客 若有问题 评论区见&#x1f4dd; &#x1f3…

【数据结构】带头双向循环链表的实现及链表顺序表的区别

目录 一、带头双向循环链表接口实现 连接关系&#xff1a; 创建哨兵位&#xff08;表头&#xff09;&#xff1a; 头插——头删&#xff1a; 尾插——尾删&#xff1a; 查找——打印&#xff1a; 指定位置pos前插入&#xff0c;删除pos位置&#xff1a; 链表销毁&#x…

真实能够生产光刻机地方

目前全球制造光刻机的主要国家包括&#xff1a; 1. **荷兰**&#xff1a;ASML&#xff08;阿斯麦&#xff09;公司是全球最大的光刻机制造商&#xff0c;总部设在荷兰。ASML公司的光刻机被广泛应用于半导体行业&#xff0c;是制造高性能芯片的关键设备之一。 2. **日本**&…

setInterval 定时任务执行时间不准验证

一般在处理定时任务的时候都使用setInterval间隔定时调用任务。 setInterval(() > {console.log("interval"); }, 2 * 1000);我们定义的是两秒执行一次&#xff0c;但是浏览器实际执行的间隔时间只多不少。这是由于浏览器执行 JS 是单线程模式&#xff0c;使用se…

解决ArcGIS导出的svg格式的图片插入Word后的字体问题

背景 在ArcGIS中设置字体为Times New Roman&#xff0c;但导入Word后字体转为等线。 ArcGIS中的Layout 导入Word​​​​​​ 原因分析 Word无法识别嵌入进SVG格式文件中的字体。 解决方案 在Export Layer窗口中&#xff0c;将Embed fonts取消勾选&#xff0c;Convert cha…

【深度学习】 探讨Stable Diffusion模型的训练及其偏向性

探讨Stable Diffusion模型的训练及其偏向性 近年来&#xff0c;生成式模型在图像生成领域取得了显著进展&#xff0c;特别是Stable Diffusion模型。作为一种基于扩散过程的生成模型&#xff0c;Stable Diffusion模型展现了生成高质量图像的巨大潜力。然而&#xff0c;与所有机…

Makefile的链接器错误:最不易被发现的bug

makefile编译时出现 collect2: error: ld returned 1 exit status我的makefile的语句为&#xff1a; # 定义编译器 CXX g# 定义编译器标志 CXXFLAGS -v -g -Wall -Wno-write-strings -stdc11# 定义Oracle的库和包含路径 ORAINCL -I/oracle/home/rdbms/public ORALIB -L/o…

本地离线模型搭建指南-RAG架构实现

搭建一个本地中文大语言模型&#xff08;LLM&#xff09;涉及多个关键步骤&#xff0c;从选择模型底座&#xff0c;到运行机器和框架&#xff0c;再到具体的架构实现和训练方式。以下是一个详细的指南&#xff0c;帮助你从零开始构建和运行一个中文大语言模型。 本地离线模型搭…

基于SSM+Vue+微信小程序的大学生就业平台系统+毕业论文

项目包含前台和后台两部分&#xff1a;多角色登录&#xff0c;功能完善&#xff0c;界面优美 前台主要功能实现&#xff1a;首页列表查看、求职信息管理、简历管理、面试邀请管理、个人中心等 后台主要功能实现&#xff1a;首页、个人中心、学生管理、企业管理、企业类型管理…

【Android面试八股文】你来讲一讲View`滑动操作可以通过哪些方式来实现?

文章目录 1. 通过`scrollTo()`和`scrollBy()``scrollTo(int x, int y)``scrollBy(int dx, int dy)``scrollTo()` 和 `scrollBy()` 的区别2. 使用动画2.1 属性动画(`ObjectAnimator`)2.2 视图动画(`TranslateAnimation`)两者的区别选择哪种动画?3. 使用Scroll实现平滑滚动效…

浏览器插件利器-allWebPluginV2.0.0.14-bata版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX插件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持谷歌、火狐等浏…