Golang-slice理解
slice
golang-slice语雀笔记整理
- slice
- go为何设计slice?
- 引用传递实现
- 扩容机制
go为何设计slice?
切片对标其他语言的动态数组,底层通过数组实现,可以说是对数组的抽象,底层的内存是连续分配的所以效率高,可以通过索引查找。
**有数组了为何还要切片? **
- 数组长度固定,切片动态扩容,更加灵活
- 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倍,是固定的倍数扩容;
相关文章:
Golang-slice理解
slice golang-slice语雀笔记整理 slicego为何设计slice?引用传递实现扩容机制 go为何设计slice? 切片对标其他语言的动态数组,底层通过数组实现,可以说是对数组的抽象,底层的内存是连续分配的所以效率高,可…...
【Linux系统】文件描述符fd
1.回顾一下文件 我们之前对文件的理解是在语言层上,而语言层去理解文件是不可能的!!! 下面是一份c语言文件操作代码!!! #include<stdio.h> int main() {FILE* fd fopen("lo…...
【嵌入式——FreeRTOS】启动任务调度器
【嵌入式——FreeRTOS】启动任务调度器 开启任务调度器vTaskStartScheduler()xPortStartScheduler()prvStartFirstTask()启动第一个任务 开启任务调度器 用于启动任务调度器,任务调度器启动后,FreeRTOS便会开始进行任务调度。 //启动任务,开…...
EFCore_客户端评估与服务端评估
定义 客户端评估: 先将表的所有数据读取至内存,再在内存中对数据进行筛选,数据的筛选工作在客户端服务端评估: 先将代码翻译为SQL语句,再执行SQL语句对数据进行筛选,数据的筛选工作在服务端(默认方式) 如何…...
Java面试题--JVM大厂篇之深入了解G1 GC:高并发、响应时间敏感应用的最佳选择
引言: 在现代Java应用的性能优化中,垃圾回收器(GC)的选择至关重要。对于高并发、响应时间敏感的应用而言,G1 GC(Garbage-First Garbage Collector)无疑是一个强大的工具。本文将深入探讨G1 GC适…...
SAP配置发布WebService接口并调用(超级详细)
文章目录 前言一、案例介绍/笔者需求二、WebService是什么? a.传输协议 b.数据协议 c.WSDL d.UDDI 三、WebService 和 WebApi 的区别以及优缺点 a.主要区别 b.优缺点 四、SAP如何发布一个webser…...
中英双语介绍美国首都:华盛顿哥伦比亚特区(Washington, D.C.)
中文版 华盛顿哥伦比亚特区(Washington, D.C.),简称华盛顿或D.C.,是美国的首都和联邦直辖区。以下是对华盛顿哥伦比亚特区各方面的详细介绍: 人口 截至2020年,美国人口普查数据显示,华盛顿哥…...
java:aocache的单实例缓存(一)
上一篇博客《java:aocache:基于aspectJ实现的方法缓存工具》介绍了aocache的基本使用, 介绍AoCacheable注解时说过,AoCacheable可以定义在构造方法上,定义在构造方法,该构建方法就成了单实例模式。 也就是说,只要构建…...
pcap包常见拆分方法
文章目录 Wireshark 拆分流量包SplitCap使用简介魔数报错示例结果 在进行流量分析时,经常需要分析pcap流量包。但是体积过大的流量包不容易直接分析,经常需要按照一定的规则把它拆分成小的数据包。 这里统一选择cic数据集里的Thursday-WorkingHours.pcap…...
C++中的类型转换操作符:static_cast reinterpret_cast const_cast dynamic_cast
目录 C语言中的类型转换 C中的类型转换 C中的类型转换操作符 static_cast reinterpret_cast const_cast volatile关键字 赋值兼容 dynamic_cast C语言中的类型转换 基本概念:赋值运算符左右两侧类型不同,或形参与实参类型不匹配…...
MySQL-SQL优化Explain命令以及参数详解
前言 在MySQL优化的众多手段中,EXPLAIN命令扮演着至关重要的角色。它是数据库管理员和开发者手中的利器,用于分析SQL查询的执行计划。通过执行EXPLAIN,MySQL会提供一份详细的查询执行计划报告,这份报告揭示了查询将如何执行&…...
别只会重启了!进来告诉你AP无法上线怎么办
号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 你们好,我的网工朋友。 作为网工,咱们都知道无线网络的重要性,尤其是对于企业网络来说,无线接入点…...
数据恢复篇:如何在 Android 手机上恢复未保存/删除的 Word 文档
在 Android 手机上访问 Word 文档通常很简单,但是当这些重要文件被删除或未保存时会发生什么?这种情况虽然令人痛苦,但并非毫无希望。到 2024 年,有几种强大的方法来处理此类数据丢失。本指南重点介绍如何在Android手机上恢复已删…...
Python | Leetcode Python题解之第208题实现Trie(前缀树)
题目: 题解: class Trie:def __init__(self):self.children [None] * 26self.isEnd Falsedef searchPrefix(self, prefix: str) -> "Trie":node selffor ch in prefix:ch ord(ch) - ord("a")if not node.children[ch]:retur…...
Ethernet是以太网通讯
...
咖啡消费旺季到来 为何想转让的库迪联营商却越来越多
文 | 智能相对论 作者 | 霖霖 去年还在朝“三年万店”计划狂奔的库迪,今年已出现明显“失速”。 早在今年2月,库迪就官宣其门店数已超过7000家,如今4个多月过去,据极海品牌监测数据显示,截至6月27日,其总…...
神经网络原理
神经网络原理是一种模拟人脑的机器学习技术,通过大量的神经元和层次化的连接进行信息处理和学习。 图1 神经元 神经网络由许多简单的计算单元或“神经元”组成,这些神经元通过连接传递信息。每个连接都有一个权重,用于调整传递的信号强度。这…...
安卓应用开发学习:获取经纬度及地理位置描述信息
前段时间,我在学习鸿蒙应用开发的过程中,在鸿蒙系统的手机上实现了获取经纬度及地理位置描述信息(鸿蒙应用开发学习:手机位置信息进阶,从经纬度数据获取地理位置描述信息)。反而学习时间更长的安卓应用开发…...
各类排序方法 手撕快排 回顾经典快排 优化版快排
快排的主要思想是分而治之 第一步,确定分界点,a 第二步,调整区间,利用分界点a,把小于分界点a的数放在左边,大于的放在右边,相等的放在哪都可以 第三步,递归处理左右两段 实现(暴…...
独一无二的设计模式——单例模式(Java实现)
1. 引言 亲爱的读者们,欢迎来到我们的设计模式专题,今天的讲解的设计模式,还是单例模式哦!上次讲解的单例模式是基于Python实现(独一无二的设计模式——单例模式(python实现))的&am…...
小红书自动化工具xhs-skill:接口逆向与数据采集实战指南
1. 项目概述:一个面向小红书内容创作的效率工具箱最近在逛GitHub的时候,发现了一个挺有意思的项目,叫PengJiyuan/xhs-skill。光看名字,你大概能猜到它和小红书有关,但具体是做什么的,可能有点模糊。作为一个…...
AI智能体文件管理:从零构建统一资产仓库与版本控制系统
1. 项目概述与核心价值最近在折腾AI智能体开发的朋友,估计没少为文件管理这事儿头疼。你辛辛苦苦训练好的模型、精心设计的提示词模板、还有那些五花八门的配置文件,是不是散落在各个角落,每次想复现或者分享都得一通乱找?更别提团…...
AI驱动Figma设计自动化:Claude插件实现自然语言到UI生成
1. 项目概述:当设计工具遇上AI助手最近在和一些资深UI/UX设计师朋友交流时,大家不约而同地提到了一个痛点:在Figma这类设计工具里,从概念到高保真原型的转化过程,依然充满了大量重复、机械的劳动。比如,我需…...
Svelte动态光标实现:状态驱动与Spring动画的交互设计
1. 项目概述:一个会“思考”的鼠标指针如果你在开发一个需要高度沉浸感和交互反馈的Web应用,比如一个设计工具、一个游戏界面,或者一个希望用户能“感受”到页面元素质感的网站,那么一个静态的、系统默认的鼠标指针就显得有些格格…...
ME6206A 系列低压差线性稳压器
概述ME6206A 系列是高精度、低功耗、采用 CMOS 技 术制造的正电压稳压器。这些器件提供大电流,具有显 著的小电压差。 该系列与低 ESR 陶瓷电容器兼容,限流器的折返 电路也作为短路保护输出电流限制器和输出引脚。性能特点高精度输出电压:1%输…...
纺织行业智能化升级进入深水区:AI验布机从“可选项”变为“必选项”
过去三年,走访过数十家纺织服装企业的行业观察者会发现一个明显的变化:2023年时,AI验布机还是展会上引人驻足的新奇设备;到了2025年,它已经成为越来越多工厂标准配置的一部分。这一转变背后,折射出整个纺织…...
Linux僵死IO与不可中断睡眠分析
Linux僵死IO与不可中断睡眠分析在 Linux 系统里,有一类问题特别让人困惑:进程存在、CPU 不高,但命令卡住、服务停不下来、甚至 kill 也无效。很多这类现象最终都与不可中断睡眠状态有关,尤其常见于 IO 阻塞场景。中级阶段需要理解…...
风云T9长续航正式上市,限时红包价仅10.99万元起售
5月16日,超长续航智享SUV——风云T9长续航正式上市,上市指导价为11.99万元-13.99万元,限时红包价10.99万元起售。新车秉持“智电全能,超级进阶”的理念,基于全球超15万用户真实需求,围绕设计、续航、智能、…...
观察使用 Token Plan 套餐后月度模型调用成本的变化趋势
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察使用 Token Plan 套餐后月度模型调用成本的变化趋势 作为一名中小型项目的开发者,管理大模型 API 的调用成本是项目…...
Android应用安全左移实践:Kiuwan SAST集成与漏洞修复指南
1. 项目概述:为什么Android应用安全需要“左移”?在移动应用开发这个行当里干了十几年,我见过太多团队在安全问题上“亡羊补牢”的场景。往往是应用上线后,被安全团队或第三方扫描工具揪出一堆高危漏洞,然后整个团队进…...
