切片的基础知识

在这里插入图片描述

文章目录

    • ● Slice 的底层实现原理?
    • ● array 和 Slice 的区别?
    • ● 拷贝大切片一定比小切片代价大吗?
    • ● Slice 深拷贝和浅拷贝?
    • ● 零切片、空切片、nil切片?
    • ● Slice 的扩容机制?
    • ● Slice 为什么不是线程安全的?如何解决这个问题?
    • ● 参数传递切片和切片指针有什么区别?
    • ● range 遍历切片的时候有什么要注意的?

● Slice 的底层实现原理?

切片是对底层数组的引用,在创建一个切片的时候,Go会自动分配一个底层数组,并维护这个数组的指针、切片的长度和容量。

● array 和 Slice 的区别?

1、数组是固定长度的,不能动态扩容,在编译期就会确定大小,切片是可以自动扩容的。 2、数组是值类型,切片是引用类型,每个切片都引用了一个底层数组,切片本身不能存储任何数据,都是底层数组存储数据,所以修改切片的时候修改的是底层数组中的数据。切片一旦扩容,指向一个新的底层数组,内存地址也就随之改变。

● 拷贝大切片一定比小切片代价大吗?

不一定。切片中的第一个字段是指向切片底层数组的指针,这是切片的存储空间,第二个字段是切片的长度,第三个字段是容量。将一个切片变量分配给另一个变量只会复制三个机器字,大切片跟小切片的区别无非就是 Len 和 Cap的值比小切片的这两个值大一些,如果发生拷贝,本质上就是拷贝上面的三个字段。

● Slice 深拷贝和浅拷贝?

浅拷贝是创建一个新的切片,但这个新切片仍然引用原切片的底层数组。 深拷贝是创建一个新的切片,并复制原来切片的所有元素到新的切片中。

● 零切片、空切片、nil切片?

零切片
我们把切片内部数组的元素都是零值或者底层数组的内容就全是 nil的切片叫做零切片,使用make创建的、长度、容量都不为0的切片就是零值切片:slice := make([]int,5) // 0 0 0 0 0 slice := make([]*int,5) // nil nil nil nil nil
nil切片
nil切片的长度和容量都为0,并且和nil比较的结果为true,采用直接创建切片的方式或new创建切片的方式:var slice []int var slice = *new([]int)
空切片
空切片的长度和容量也都为0,但是和nil的比较结果为false,因为所有的空切片的数据指针都指向同一个地址 0xc42003bda0;使用字面量、make可以创建空切片:var slice = []int{} var slice = make([]int, 0) 05. 切片的扩容策略

● Slice 的扩容机制?

新申请的容量如果大于当前容量的两倍,会将新申请的容量直接作为新的容量,如果新申请的容量小于当前容量的两倍,会有一个阈值,即当前切片容量小于256时,切片会将当前容量的2倍作为新申请的容量,如果大于等于256,每次容量会增加 (旧容量+3*256)/4。

● Slice 为什么不是线程安全的?如何解决这个问题?

切片的底层数据结构体包括一个指向数组的指针,在多个线程同时对 切片进行操作时会导致竞态条件。(并发读写问题、切片扩容问题) 通过使用适当的同步机制如互斥锁、读写锁,确保对切片的并发访问是安全的,从而避免竞态条件和数据破坏。 (竞态条件是指在并发程序中,由于多个线程或goroutine同时访问或修改共享资源,从而导致程序的执行结果依赖于线程或goroutine的调度顺序,可能产生不确定和错误的结果。)

● 参数传递切片和切片指针有什么区别?

当切片作为参数传递时,其实就是一个结构体的传递,因为Go语言参数传递只有值传递,传递一个切片就会浅拷贝原切片,但因为底层数据的地址没有变,所以在函数内对切片的修改,也将会影响到函数外的切片。
在 Go 语言中,切片虽然是引用类型,但在函数中使用 append 操作时,需要注意一些细节。append 函数可能会导致切片底层数组重新分配内存,从而影响切片的引用传递。
具体来说,当 append 导致切片容量不足而需要扩容时,append 操作会创建一个新的底层数组,并返回新的切片引用。
由于你没有将这个新引用返回给原切片,原切片仍然指向旧的底层数组,因此不会体现出引用传递的效果。
参数传递切片指针就很容易理解了,如果你想修改切片中元素的值,并且更改切片的容量和底层数组,则应该按指针传递。

● range 遍历切片的时候有什么要注意的?

副本与原始切片: 在range遍历中,实际上会创建每个元素的副本。这意味着你在循环中对副本的修改不会影响原始切片。如果需要修改原始切片,应该使用索引来操作。
只读: 默认情况下,range遍历是只读的,不能修改切片的元素。如果尝试在range循环中修改元素值,会引发编译错误。
索引和值的顺序: 在range循环中,索引总是在前,元素值总是在后。如果只需要索引而不需要元素值,可以使用下划线 _ 来忽略元素值。
切片遍历的性能考虑:尽管使用range遍历切片是非常方便的,但在性能方面可能会有一些影响。每次使用range遍历时,都会创建元素的副本,这可能导致额外的内存开销和性能下降。如果在性能敏感的场景下遇到性能问题,你可以考虑使用索引遍历,以避免创建副本。另外,如果需要在遍历时修改切片的元素,也应该使用索引遍历,以确保修改能够直接影响到原始切片。
切片为空: 如果切片为空,使用range遍历不会执行任何循环体,这可能会导致你的代码出现逻辑问题。在使用range之前,最好先检查切片的长度。
切片为nil: 如果切片为nil,使用range遍历会引发运行时错误。同样,遍历之前应该确保切片不为nil。
遍历数组 vs. 切片: 在数组上使用range遍历和在切片上使用range遍历是不同的。对于数组,range返回索引和元素的副本,而在切片上,range返回索引和元素值的副本。

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

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

相关文章

Hive SQL:实现炸列(列转行)以及逆操作(行转列)

目录 列转行行转列 列转行 函数: EXPLODE(ARRAY):将ARRAY中的每一元素转换为每一行 EXPLODE(MAP):将MAP中的每个键值对转换为两行,其中一行数据包含键,另一行数据包含值 数据样例: 1、将每天的课程&#…

新款奔驰GLE350升级原厂空气悬挂系统有哪些功能

奔驰 GLE350 升级原厂空气悬挂带来了一系列显著的优势和功能: 1. 舒适性提升 • 能够根据不同的路况和驾驶模式自动调节悬挂硬度和高度,有效过滤路面颠簸,为驾乘者提供更加平稳、舒适的行驶体验。 2. 行驶高度调节 • 驾驶者可以手动或自…

Web服务器与Apache(虚拟主机基于ip、域名和端口号)

一、Web基础 1.HTML概述 HTML&#xff08;Hypertext Markup Language&#xff09;是一种标记语音,用于创建和组织Web页面的结构和内容&#xff0c;HTML是构建Web页面的基础&#xff0c;定义了页面的结构和内容&#xff0c;通过标记和元素来实现 2.HTML文件结构 <html>…

商汤上海AI实验室联合发布:自动驾驶全栈式高精度标定工具箱(含车、IMU、相机、激光雷达等的标定)

前言 在自动驾驶技术飞速发展的今天&#xff0c;传感器的精确标定对于确保系统性能至关重要。SensorsCalibration&#xff0c;一个专为自动驾驶车辆设计的标定工具箱&#xff0c;提供了一套全面的解决方案&#xff0c;用于校准包括IMU、激光雷达、摄像头和雷达在内的多种传感器…

Spring Cloud Gateway 与 Nacos 的完美结合

在现代微服务架构中&#xff0c;服务网关扮演着至关重要的角色。它不仅负责路由请求到相应的服务&#xff0c;还承担着诸如负载均衡、安全认证、限流熔断等重要功能。Spring Cloud Gateway 作为 Spring Cloud 生态系统中的一员&#xff0c;以其强大的功能和灵活的配置&#xff…

双链表的实现

双链表的实现 前言链表的基础知识双链表的有关方法的实现 前言 Hello&#xff0c;亲爱的CSDN的小伙伴们&#xff0c;你们好&#xff0c;今天我来给大家分享有关双链表的知识&#xff0c;希望可以帮助到大家。 链表的基础知识 1.链表一共有八种&#xff0c;而最常见的只有两种…

【pytorch11】高阶操作

高阶操作 WhereGather where 三个参数&#xff0c;第一个是condition&#xff0c;第二个参数是源头A&#xff0c;第三个参数是源头B&#xff0c;也就是说有两项数据A和B&#xff0c;C有可能来自于A也有可能来自于B&#xff0c;如果全部来自于A的话直接赋值给A&#xff0c;如果…

SpringBoot实现图片添加水印

提示&#xff1a;今日完成图片添加水印功能 后续可能还会继续完善这个功能 文章目录 目录 文章目录 前端部分 后端 Xml Controller层 Sercive层 Service实现层 Config配置层 application.properties 文件后缀名获取 常量定义 前端部分 <!DOCTYPE html> <htm…

在postman中调试supabase的API接口

文章目录 在supabase中获取API地址和key知道它的restfull风格在postman中进行的设置1、get请求调试2、post新增用户调试3、使用patch更新数据&#xff0c;不用put&#xff01;4、delete删除数据 总结 在supabase中获取API地址和key 首先登录dashboard后台&#xff0c;首页- 右…

deepin基于apt-mirror同步软件源及构建本地内网源

1.安装apt-mirror sudo apt install -y apt-mirror2.配置apt-mirror(/etc/apt/mirror.list) sudo cp /etc/apt/mirror.list /etc/apt/mirror.list.deepin.bak #备份配置文件 sudo gedit /etc/apt/mirror.list修改如下&#xff1a; deb [trustedyes] https://mirrors.bfsu.ed…

1976 ssm 营地管理系统开发mysql数据库web结构java编程计算机网页源码Myeclipse项目

一、源码特点 ssm 营地管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开…

单例模式(下)

文章目录 文章介绍步骤安排及单例讲解step1&#xff1a;注册单例类型&#xff08;main.cpp&#xff09;step2&#xff1a;定义类和私有构造函数&#xff08;keyboardinputmanager.h&#xff09;step3:&#xff08;keyboardinputmanager.cpp&#xff09;step4&#xff1a;在qml中…

【Qt】认识Qt界面Hello world小程序

一.认识Qt界面 1.左边栏 在编辑模式下&#xff0c;左边竖排的两个窗⼝叫做 "边栏" 。 ① 是项⽬⽂件管理窗⼝ ② 是打开⽂件列表窗⼝。 边栏⾥的窗⼝数⽬可以增加&#xff0c;边栏⼦窗⼝标题栏有⼀排⼩按钮&#xff0c;最右边的是关闭按钮&#xff0c;倒数第⼆个是 …

HTML5+CSS3+JS小实例:图片九宫格

实例:图片九宫格 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1…

【吊打面试官系列-MyBatis面试题】模糊查询 like 语句该怎么写?

大家好&#xff0c;我是锋哥。今天分享关于 【模糊查询 like 语句该怎么写?】面试题&#xff0c;希望对大家有帮助&#xff1b; 模糊查询 like 语句该怎么写? 第 1 种&#xff1a;在 Java 代码中添加 sql 通配符。 string wildcardname “%smi%”; list<name> names …

无法访问指向的web服务器(或虚拟主机)的目录,请检查网络设置

微信公众平台,进行业务域名、JS接口安全域名、网页授权域名配置时&#xff0c;遇到的问题中有&#xff1a;无法访问指向的web服务器&#xff08;或虚拟主机&#xff09;的目录&#xff0c;请检查网络设置&#xff0c;这里简单记录一下处理过程。 关于这个问题首先保证下载…

Win11找不到组策略编辑器(gpedit.msc)解决

由于需要同时连接有线网络和无线网络&#xff0c;且重启后双网络都自动连接&#xff0c;因此需要配置组策略。 但是win11找不到组策略编辑器。 灵感来源&#xff1a;Win11找不到组策略编辑器&#xff08;gpedit.msc&#xff09;解决教程 - 知乎 (zhihu.com) 在Win11中&#…

API-Window对象

学习目标&#xff1a; 掌握Window对象 学习内容&#xff1a; BOM&#xff08;浏览器对象模型&#xff09;定时器-延时函数JS执行机制location对象navigation对象history对象 BOM&#xff08;浏览器对象模型&#xff09;&#xff1a; BOM是浏览器对象模型。 window对象是一个全…

Taro +vue3 中的微信小程序中的分享

微信小程序 右上角分享 的触发 以及配 useShareAppMessage(() > {return {title: "电影属全国通兑券",page: /pages/home/index,imageUrl: "http:///chuanshuo.jpg",};}); 置 就是Taro框架中提供的一个分享Api 封装好的

笔记本电脑部署VMware ESXi 6.0系统

正文共&#xff1a;888 字 18 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面我们介绍了在笔记本上安装Windows 11操作系统&#xff08;Windows 11升级不了&#xff1f;但Win10就要停服了啊&#xff01;来&#xff0c;我教你&#xff01;&#xff09;&#xff0c;也介绍了…