Golang-slice理解

news2024/11/18 12:40:42

slice


golang-slice语雀笔记整理

  • slice
    • go为何设计slice?
    • 引用传递实现
    • 扩容机制

go为何设计slice?

切片对标其他语言的动态数组,底层通过数组实现,可以说是对数组的抽象,底层的内存是连续分配的所以效率高,可以通过索引查找。
image.png
**有数组了为何还要切片? **

  1. 数组长度固定,切片动态扩容,更加灵活
  2. golang官方文档明确说了go只有值传递,而通过切片可通过值传递实现引用传递

所以切片的核心在于它如何实现引用传递、 以及 切片的扩容机制

引用传递实现

切片实现引用传递主要还是跟它的数据结构有关。 在slice的结构体中有3个字段, array, len, cap; 其中的array指向底层数组开始的内存。 那么值传递的时候传的内存区域其实是同一块。此时虽然对副本修改,但实际上改的是同一块内存上的数据,就实现了引用传递。 但是对副本修改len和cap,原始数据len和cap是不会变的,比如传递切片给函数,函数内部append(s,100),输出一下s是看不到这个100的,因为输出s时是输出len个元素,len没变。

扩容机制

1.19下slice.go下的grouslice方法源码

扩容的触发时机:len跟cap相等时,下次append就是触发扩容。阅读slice.go下的growslice方法源码,可以分析slice扩容机制。
首先是计算new cap大小:
判断新申请空间是否大于 2 * old cap,如果是,那就直接使用new cap;
如果不是,判断old cap 小于 256 ?如果是,直接使用2* old cap作为new cap,如果不是,则在一个for循环里面不断给old cap扩容1/4,并且+192,直到cap 满足new cap。 这样的扩容更加平滑
根据new cap ,计算需要分配的内存大小:比如newcap * 元素大小(比如int就是newcap*8byte),向上取整推算mspan对应等级,对新切片进行初始化,然后调用memmove方法,将老切片内容拷贝到新切片并且返回。

我觉得go的切片扩容策略相比C++更加的平滑,初始阶段的扩容迅速,后面的增加更省内存。像C++的vector的话linux下1.5倍考虑到内存的复用,win+vs下2倍,是固定的倍数扩容;

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

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

相关文章

qt结合vs2022安装

进入清华大学开源软件: 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载完成后,双击进行安装: 进入邮箱进行验证: 可能是因为网络问题,无法安装。 重新安装5.12.12版本。 安装后启动失败,重新…

tauri使用github action实现跨平台编译并解决编译错误,mac已损坏,无法打开,你应该将它移到废纸篓解决办法

正常编译为跨平台结果就像上面的,有mac/windows/linux的安装程序,直接下载就可以安装使用,我的这个livebox桌面端仓库地址:GitHub - Sjj1024/LiveBox: livebox,里面有编译文件可以参考。今天主要讲一下遇到的问题。 官…

【FFmpeg】av_write_frame函数

目录 1.av_write_frame1.1 写入pkt(write_packets_common)1.1.1 检查pkt的信息(check_packet)1.1.2 准备输入的pkt(prepare_input_packet)1.1.3 检查码流(check_bitstream)1.1.4 写入…

C++知识点总结全系列 (05):IO 类的详细总结和分析

1、基类 istream 和 ostream (1)istream A.What 输入流的抽象类,是所有输入流类的基类 B.Why(输入流的作用) 用于从数据源(如文件、标准输入设备等)读取数据 (2)ostream A.What 输出流的抽象类,是所有输…

重温react-09(高阶组件的使用方式和注意事项)

高阶组件 可以理解为vue的混入吧,但是没有那个方便(个人见解) 挂载的全局App.jsx的代码 import React from react; import LearnFunction05 from ./LearnFunction05; // 这个是高阶函数的用法 export default function boxReact() {retur…

六西格玛绿带培训的证书有什么用处?

近年来,六西格玛作为一套严谨而系统的质量管理方法,被广泛运用于各行各业。而六西格玛绿带培训证书,作为这一方法论中基础且重要的认证,对于个人和企业而言,都具有不可忽视的价值。本文将从多个角度深入探讨六西格玛绿…

你敢相信吗,AI绘画正在逐渐取代你的工作!

前言 在当今信息技术高速发展的时代,AI绘画技术的崛起已引起了广泛关注和讨论。许多人开始担心AI技术是否会逐渐取代传统绘画师的工作。人类无疑是感性的动物,创作出来的艺术作品常常带有浓郁的个人风格和情感。但AI绘画在某些方面的突破,使…

浅谈定时器之泊松随机定时器

浅谈定时器之泊松随机定时器 “泊松随机定时器”(Poisson Random Timer),它允许你基于泊松分布来随机化请求之间的延迟时间,这对于模拟具有随机到达率的事件特别有用,如用户访问网站或服务的请求。 泊松分布简介 泊松分布是一种统计与概率…

大厂面试官问我:在同步binlog的时候主库是一个时间,从库是一个时间,底层是怎么解决的?【后端八股文八:Mysql日志八股文合集(2)】

本文为【Mysql日志八股文合集(2)】初版,后续还会进行优化更新,欢迎大家关注交流~ 大家第一眼看到这个标题,不知道心中是否有答案了?在面试当中,面试官经常对项目亮点进行深挖,来考察…

国产压缩包工具——JlmPackCore SDK说明(二)——JlmPack_Create函数说明

一、JlmPack_Create函数说明 JlmPack_Create函数是创建jlm压缩文件的核心函数,最大允许CATALOG_MAX_LIMIT(请参考Config.h)个目录,意思是包括文件夹和文件在内,遍历整个列表最大允许CATALOG_MAX_LIMIT个目录对象&#…

Zabbix HA高可用集群部署

Zabbix HA高可用集群介绍 关键基础设施通常需要高可用性 (HA),因为这些基础设施几乎不会造成停机。因此,对于任何可能失败的服务,都必须有一个故障转移选项,以便在当前服务失败时接管。 Zabbix 提供了易于设置的本机高可用性解决…

智慧渔港:海域感知与岸线监控实施方案(智慧渔港渔船综合管控平台)

文章目录 引言I 技术栈1.1 物理结构图1.2 功能逻辑结构图II 云台(大华)2.1 设备网络SDK运行在Mac平台2.2 WEB无插件开发包III 术语3.1 渔业引言 利用渔船现有的定位导航通讯设备等资源,实现岸线和近岸海域内违法船舶和可疑船舶预警、抓拍、跟踪和行为分析。 在渔船上安装风…

2024百元蓝牙耳机哪个好?2024性价比最高的蓝牙耳机推荐

2024想要在百元左右找到一款好用的性价比高的蓝牙耳机,确实是个不小的挑战。市场上各种耳机品牌和型号琳琅满目,各有各的特点。你可能会疑惑,如何才能在预算内挑选到一款性价比高、音质好的耳机呢?这篇文章将为你提供一些选购百元…

湖南省教育网络协会莅临麒麟信安调研教育网络数字化建设及教育信创发展情况

6月28日下午,湖南省教育网络协会理事长张智勇、秘书长刘志勇、副理事长黄旭、胡洪波、周中伟等协会相关负责人一行莅临麒麟信安,就湖南省教育网络数字化建设、教育信创工作等主题进行深入调研。麒麟信安副总裁王攀热情接待。 协会成员一行来到麒麟信安展…

1978Springboot在线维修预约服务应用系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot在线维修预约服务应用系统是一套完善的信息系统,结合springboot框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发 ),系统具有完整的源代码和…

中国智能工厂自动化集成商100强:广东23家,江苏20家,上海浙江紧随其后

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 更多的海量【智能制造】相关资料,请到智能制造online知识星球自行下载。 在数字化、智能化的浪潮中,中国智能工厂自动化集…

下代iPhone或回归可拆卸电池,苹果这操作把我看傻了

刚度过一个愉快的周末,苹果又双叒叕摊上事儿了。 iPhone13 系列被曝扎堆电池鼓包了。 早在去年,就有 iPhone13 和 iPhone14 用户反馈过类似的问题,表示在手机仅仅使用了一年多的时间就出现了电池鼓包的情况,而且还把屏幕给撑起来了…

SAP Build 3-调用SAP BAPI和调用S4HC API

1. 调用SAP BAPI 1.1 前提 项目已创建 SAP环境登录正常 1.2 引入BAPI SDK 商店中下载BAPI SDK Process中导入BAPI SDK 1.3 新建action group 新建action group时,会要求填写SAP登录信息,根据连接类型分为SSO,Basic和Custom 如果选择SS…

【办公软件使用分享—Word篇】实用技巧 一学就会 沈阳电脑办公软件基础培训

在平时的工作学习中,Word真真是让很多人头疼的一件事,今天给大家分享20个案例,感受下Word真正的力量! 1.插入自动目录 没有目录的文档不是一份合格的文档,很多人认为在Word里插入目录是一件很麻烦的事,其…

Soul打造安全社交元宇宙环境,全力守护用户线上社交安全

在数字化时代的浪潮中,智能安全线上社交正成为人们日常生活中的重要组成部分。随着人们对社交媒体和在线平台依赖程度的不断增加,保障个人信息安全和网络安全变得至关重要。在此背景下,社交平台致力于采取多种措施来保障用户的隐私安全,提升社交体验的质量和安全性。而Soul全方…