golang- slice解析

news/发布时间2024/8/25 17:43:29

Slice(切片)

定义

切片的概念在python中也存在这个概念,在go中,切片是对数组的一个连续片段的引用,所以切片是一个引用类型,它的内部结构包含地址长度容量
版本号:go version go1.20 darwin/arm64

runtime/slice.gotype slice struct {array unsafe.Pointer len   intcap   int
}

其中:

  • array是底层数组指针,指向该切片的第一个元素
  • len是切片的长度
  • cap是切片的容量

变量声明

主要是使用make关键字去进行切片的创建

// make([]T, len, cap)
// len: 长度
// cap: 容量
// T: 类型
var s1 []int = make([]int, 5, 10)var s2 []int =make([]int, 5)容量未声明,则与长度相等

s1在初始化后,长度为5,容量为10,值为[0,0,0,0,0]

s2在初始化后,长度为5,容量为5,值为[0,0,0,0,0]

扩容

扩容的前提是当前切片容量不足以容纳增加后的数据。

相关函数:

runtime/slice.go/growslicenewcap := oldCapdoublecap := newcap + newcapif newLen > doublecap {newcap = newLen} else {const threshold = 256if oldCap < threshold {newcap = doublecap} else {// Check 0 < newcap to detect overflow// and prevent an infinite loop.for 0 < newcap && newcap < newLen {// Transition from growing 2x for small slices// to growing 1.25x for large slices. This formula// gives a smooth-ish transition between the two.newcap += (newcap + 3*threshold) / 4}// Set newcap to the requested cap when// the newcap calculation overflowed.if newcap <= 0 {newcap = newLen}}}
  • 如果当前容量扩充两倍后,仍然无法容纳新的数据,那么新的容量就为新的长度oldlen+num

  • 扩充两倍后,可以容纳新的数据,再判断oldlen是否>=1024,大于则扩充1.25倍,小于则扩充两倍

函数传参

切片作为函数参数传递时,传递的是切片的引用,所以在函数内部修改切片的值,会影响到函数外部的切片值。

简单来说,切片a作为参数传递时,编译器会根据a的地址、长度、容量,创建一个新的切片b,然后将b作为参数传递给函数,所以在函数内部修改切片的值,a和b指向的底层数组x一致。修改b的元素,本质上修改底层数组的数据,所以a的值也会发生变化。

但如果切片b发生扩容,情况又不一样

更新切片

a=[]int{1,2,3,4,5}func UpdateSlice(b []int) {b[0] = 100
}

因为只是更新切片数据,修改b的元素,本质上修改底层数组的数据,a和b都还是指向同一块内存空间,所以a的值也会发生变化。

扩容切片

a=[]int{1,2,3,4,5}func GrowSlice(b []int) {b = append(b, []int{1, 2, 3, 4, 5, 6, 7, 8, 9}...)fmt.Println(b)
}

b进行了append操作,容量不足,发生扩容,编译器重新分配一块合适的内存空间,并修改了b的指向,此时再去修改b的值,不会影响到a的值。

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

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

相关文章

基于线性余弦变换的实时多边形明暗处理

基于线性余弦变换的实时多边形明暗处理 动机使用区域灯光进行着色可以为CG渲染添加大量真实感。然而,它需要求解球面方程,这使得实时渲染具有挑战性。在这个项目中,开发了一种新的球形分布,能够实时使用多边形灯光对基于物理的材料进行着色。 为什么多边形明暗处理很复杂?…

入门乐理(音律屋课程笔记)

认识钢琴键盘与音名钢琴88键,7个白键和5个黑键为一组,去掉最左侧三个键,最右侧1个键,共7组两个黑键和五个黑键组成一组音名:CDEFGAB升降号与还原号

导入jar包,比如导入pymysql

1 jar加载 查看源码运行脚本:%SPARK_HOME%\bin\spark-class2.cmd 关于jar包加载的说明。 1.1 将包放到文件夹路径%SPARK_HOME%\jars里 anaconda是一样的哈,不需要额外改路径。下载地址去mysql官网下哈,下载对应mysql版本的。https://dev.mysql.com/downloads/connector/j/ …

20211316郭佳昊 《信息安全系统设计与实现(上)》 第十周学习总结

一、任务要求 [ 1 ] 知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容 (4分) 我在学****知识点,请你以苏格拉底的方式对我进行提问,一次一个问题 核心是要求GPT:请你以苏格拉底的方式对我进…

/bin/ld: cannot find -lcolamd

001、make编译报错:/bin/ld: cannot find -lcolamd 002、查找该文件(py38) [root@pc1 Augustus-3.5.0]# find / -name "libcolamd.so" ## 系统上不存在该文件; 那么解决的话就应该安装, 但是安装什么呢? 003、在其他机器上查找该文件(base) [b2022…

安卓自定义控件快速了解

自定义控件,自定义视图方式, 假设我们写好一个视图,就以这个视图封装起来做成一个组件,这个自定义的控件就想当方便以后相同功能时直接调用 这个核心分为三步,第一步编写一个类继一个视图,这个继承的视图比如​RelativeLayout​,除了 ​RelativeLayout​以外,Android 还…

自制x86 Bootloader开发笔记(3)——— 进入长模式

前言 本项目是基于IA32架构架构(32位Intel架构)的,而IA32架构有以下的操作模式:实模式、保护模式、虚拟8086模式和系统管理模式。这些模式被称为 传统模式。实模式是计算机刚启动时的模式,在实模式下可以随意访问可用的内存地址,实模式比较简单直接,但是随着操作系统的发展…

图床搭建

搭建自己的图床 腾讯云配置 当前腾讯云的对象存储服务还是挺便宜的,如果仅用于存储博客中的一些图片,个人使用量不高,一年花费\(<10\)元。 创建存储桶 腾讯云官方的介绍:存储桶(Bucket)是对象的载体,可理解为存放对象的“容器”,且该“容器”无容量上限。对象以扁平…

性能测试复习准备——linux环境下安装mysql8

mysql下载地址:https://dev.mysql.com/downloads/mysql/ 下载完成后,把软件包上传到此目录下:/soft/mysql8/并解压缩到指定目录下:/evir/mysql8/1 1

闲来无聊,花了1小时我去爬了掘金相亲角热门100条嘉宾信息

写在前面 就在这周三,无意间我在掘金刷到一篇文章,让我这个35岁的单身老狗又次相信了爱情,而且相信真的会有那种所谓的缘分和相濡以沫、双向奔赴的爱情。 我又相信了爱情 文中男主是在掘金相亲角成功的找到了另一半,而顺利结婚,打动我的应该是女主的真诚吧,或许应该说那应…

阿贝云服务器使用感受

推荐一下阿贝云的免费服务器,没有流量限制,一个机还免费给一个IP,免费可以续期。系统也是可以免费装windows(这比三丰要好,三丰装windows居然要给一块钱)。总结一下,很适合初学者和中小站长。赞,希望做的更好给大家分享一个可以永久免费试用的云电脑。 废话不多说,就是…

php开发之文件下载的实现

前言 php是网络安全学习里必不可少的一环,简单理解php的开发环节能更好的帮助我们去学习php以及其他语言的web漏洞原理 正文 在正常的开发中,文件下载的功能是必不可少,比如我们在论坛看到好看图片好听的歌时,将其下载下来时就涉及到文件的下载等等文件功能。但也会出现漏洞…

typeof不能检测js对象是否是数组的原因是: typeof会将object, array和null都返回为object

下面哪些方式在同一个窗口下能够检测一个js对象是数组类型? A Array.isArray() B instanceof C typeof D Object.prototype.toString.call() 正确答案:ABD A:Array 为 js 的原生对象,它有一个静态方法:Array.isArray(),能判断参数是否为数组 B:instanceof 运算符返回一个…

【1.0】Go语言介绍及引入

【一】Go语言介绍Go语言是Google公司在2007开发一种静态强类型、编译型语言,并在2009年正式对外发布。静态强类型语言需要先编译再执行比如C、C#、Java等语言需要先将代码编译成不同平台的可执行文件,才能在不同平台上运行需要解释器比如Python、PHP、node.js等语言,将代码边…

smp irq affinity介绍

一、概述硬件中断发生频繁,是件很消耗 CPU 资源的事情,在多核 CPU 条件下如果有办法把大量硬件中断分配给不同的 CPU (core) 处理显然能很好的平衡性能。kernel 2.4 以后的版本利用可编程中断控制器的特性支持把不同的硬件中断请求(IRQs)分配到特定的 CPU 上,这个绑定技术…

三角形的生命-NVIDIA的逻辑管道

三角形的生命-NVIDIA的逻辑管道 自从突破性的费米架构发布近5年以来,也许是时候刷新其下的主要图形架构了。费米是第一个实现完全可扩展图形引擎的NVIDIA GPU,其核心架构可以在开普勒和麦克斯韦中找到。 本文关注GPU如何工作的图形,尽管一些原理(如着色器程序代码的执行方式…

基于MacOS M2 芯片的Mysql 数据库安装与使用

第一步:MySQL软件下载与安装 1.1 登录网址:https://dev.mysql.com/downloads/mysql/,选择系统:MacOS,版本:8.0.35,或者更新的版本,OS version选择ARM,64-bit,点击下Download1.2 接下来安装软件:双击 mysql-8.0.35-macos13-arm64.dmg,点继续或下一步,使用强密码…

Android深入学习之观察者模式与ViewModel的实现机制

1.观察者模式 Observer Pattern Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. 定义对象间的一种一对多依赖关系,当该对象(subject)改变状态时,所有依赖于它的对象(…

2023-2024 20231404高伟光《计算机基础与程序设计》第七周学习总结

作业信息作业班级 23级14班作业要求 第七周要求作业目标 自主学习计算机概论第八章,学习c语言第六章作业正文 此博客教材内容总结 计算机概论:应用层涉及了数据结构,本章介绍了栈(先进后出),队列(先进先出),列表(线性,无线),树,二叉树(每个节点只有一个父母节点…

从低维空间到高维空间

听了复旦大学李颖洲教授的讲座,记录一下自己的理解。前言 我们通常接触到的维度是 \(1\sim3\) 维,我们的认知大部分都是从这些维度得到的,虽然我们常常会想象高维空间的事物,但是难免有一些不同之处。我们理解一个事物,通常要转换为图像,但是高维空间的事物显然我们无法在…
推荐文章