golang的切片使用总结一

举例1:make([]int, b)

s := make([]int, 10)
fmt.Printf("s:%v, len of s:%v, cap of s:%v   \n", s, len(s), cap(s))

打印结果:s:[0 0 0 0 0 0 0 0 0 0], len of s:10, cap of s:10

结论:make([]int, 10) 创建的切片是capacity(容量)为10,且len(长度)为10,只是10个元素均为0

举例2:make([]int, b)后再append

s := make([]int, 10)
s = append(s, 10)
fmt.Printf("s:%v, len of s:%v, cap of s:%v   \n", s, len(s), cap(s))

打印结果:s:[0 0 0 0 0 0 0 0 0 0 10], len of s:11, cap of s:20

结论:向一个capacity为10,len为10的切片追加元素,由于capacity不足,引发扩容,切片会采用原来2倍的容量作为新的容量,并把原来的元素拷贝到新空间,再追加新元素。所以元素为11个,capacity为20

举例3:make([]int, 0, b)

s := make([]int, 0, 10)
fmt.Printf("s:%v, len of s:%v, cap of s:%v   \n", s, len(s), cap(s))

打印结果:s:[], len of s:0, cap of s:10 

结论:make([]int, 0, 10) 创建的切片是capacity(容量)为10,但len(长度)为0,即没有元素

举例4:make([]int, a, b)

s := make([]int, 10, 12)
fmt.Printf("s:%v, len of s:%v, cap of s:%v   \n", s, len(s), cap(s))

打印结果:s:[0 0 0 0 0 0 0 0 0 0], len of s:10, cap of s:12

结论:make([]int, 10, 12) 创建的切片是capacity(容量)为12,len(长度)为10,且10个元素都为0

举例5:make([]int, 0, b)后再append

s := make([]int, 0, 10)
s = append(s, 10)
fmt.Printf("s:%v, len of s:%v, cap of s:%v   \n", s, len(s), cap(s))

打印结果:s:[10], len of s:1, cap of s:10

结论:向一个capacity为10,len为1的切片中追加元素时,由于capacity足够,可以直接追加,所以最终len为1,capacity仍然为10

举例6:make([]int, a, b)后再截取

s := make([]int,10,12)  
s1 := s[8:]
fmt.Printf("s1: %v, len of s1: %d, cap of s1: %d",s1,len(s1),cap(s1))

打印结果:s1:[0 0], len of s1:2, cap of s1:4

结论:make([]int, 10, 12)创建的是capacity为12,len为10的切片s,s1从下标为8的位置开始截取,所以实际只截取到s[8],s[9]两个元素,长度为2。s1的capacity是根据截取起始位置算的,所以capacity为4

举例7:make([]int, a, b)后再截取

s := make([]int,10,12)  
s1 := s[8:9]
fmt.Printf("s1: %v, len of s1: %d, cap of s1: %d",s1,len(s1),cap(s1))

打印结果:s1:[0], len of s1:1, cap of s1:4 

结论:s是一个capacity为12,len为10的切片,s1从下标为8的位置开始截取,下标为9的的位置结束,由于左边是闭区间,右边是开区间,所以只截取到一个元素,即s1的len为1。但是s1的capacity是根据截取起始位置算的,所以capacity为4

举例8:make([]int, a, b)后截取,再修改新切片

s := make([]int, 10, 12)
s1 := s[8:]
s1[0] = -1
fmt.Printf("s:%v", s)

打印结果:s:[0 0 0 0 0 0 0 0 -1 0]

结论:截取成新切片后,修改新切片的值,发现旧切片的值也变了。所以新旧切片共享同一块内存

本篇总结:

1. 创建切片的语法为:make([]int, a,b),参数a表元素个数,即len值,参数b表切片容量,即capacity值。

2. 当不传a值时,即格式为make([]int,b)时,表创建一个capacity为b的,len也为b的切片,元素全都为0

3. 当向一个切片append元素时,若capacity足够,则直接压入切片;若capacity不足时,则重新申请原2倍的空间,先把旧数据copy到新空间,再压入新元素

4. 截取切片时,无论截取多少元素,新切片的capacity是从原切片的起始位置算的,直到原切片的结尾

5. 截取切片时,新旧切片共享同一块内存

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

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

相关文章

c++模板库容器list vector map set操作和性能对比

文章目录 listvectormapset性能比较总结 list 列表&#xff08;list&#xff09;是C STL中的一种容器类型&#xff0c;它是一个双向链表&#xff0c;可以在任意位置高效地添加、删除、移动元素。 以下是一些常用的列表操作&#xff1a; 创建列表 #include <list> std…

Jetson Orin NX 开发指南(1): 系统烧录

一、SDK Manager SDK Manager 工具是 NVIDIA 官方推荐的烧写和管理 Jetpack 系统组件的一个图形化烧写工具&#xff0c;使用起来非常的简单方便&#xff0c;但是该软件需要在 x86 的 Ubuntu 18.04 或 Ubuntu 20.04 的系统上运行&#xff0c;因此我们需要准备一台安装了 Ubuntu…

Redisson程序化的配置方法

2.1. 程序化配置方法 Redisson程序化的配置方法是通过构建Config对象实例来实现的。例如&#xff1a; Config config new Config(); config.setTransportMode(TransportMode.EPOLL); config.useClusterServers()//可以用"rediss://"来启用SSL连接.addNodeAddress(…

记录:Unity脚本的编写3.0

目录 前言前置控制方法查看效果移动方式 前言 前面记录了一些通过脚本控制对象模型移动和通过用户的操作对模型进行变化的方法&#xff0c;那么为了让我们创造的不论是地形还是模型都拥有真实的物理引擎&#xff08;大雾&#xff09;&#xff0c;那么这次就使用脚本控制模型感…

函数reshape(-1,)里的-1的意思

reshape函数是对narray的数据结构进行维度变换&#xff0c;由于变换遵循对象元素个数不变&#xff0c;在进行变换时&#xff0c;假设一个数据对象narray的总元素个数为N&#xff0c;如果我们给出一个维度为&#xff08;m&#xff0c;-1&#xff09;时&#xff0c;我们就理解为将…

【Linux C】Linux如何执行一个程序(程序存储空间、系统调用、内核调用)

文章目录 一、程序存储空间1.1 C语言程序存储空间1.2 用户空间和内核空间1.3 用户模式和内核模式 二、内核调用-系统调用-C语言库函数2.1 系统调用和内核调用2.2 C语言库函数 三、Linux如何执行一个程序 一、程序存储空间 本节说的空间主要是指内存空间&#xff0c;即程序如何分…

链表(2)——带头双向循环链表

&#x1f341;一、链表的分类 &#x1f315;1.单向或者双向 &#x1f315;2.带头或者不带头&#xff08;有无哨兵&#xff09; &#x1f315;3.循环或者不循环 &#x1f315;4.无头单向非循环链表&#xff08;常用&#xff09; &#x1f315;5.带头双向循环链表&#xff08;常用…

案例分享:原生广告如何助力app实现高效变现收益的转化

原生广告是指将广告嵌入到APP的内容中&#xff0c;使其与APP内容融为一体&#xff0c;达到获得用户关注的效果。在形式上&#xff0c;原生广告并不像传统广告那样显眼&#xff0c;而是以一种更加自然的方式展现在用户面前。 它采用了与APP相似的设计风格和交互方式&#xff0c…

深度学习DAY1:神经网络NN;二元分类

深度学习笔记 DAY1 深度学习基本知识 1.神经网络 1.1 单一神经元 所有神经元将房屋大小size作为输入x,计算线性方程&#xff0c;结果取max&#xff08;0&#xff0c;y&#xff09;,输出预测房价y ReLU函数&#xff08;线性整流函数&#xff09;–max&#xff08;0&#xf…

Axios、SASS学习笔记

目录 前言 一、Axios基础认识 1、简介 2、相关文档 3、基本配置 4、基础快捷使用 二、Axios封装 1、公共配置文件 2、细化每个接口的配置 3、使用并发送请求 三、SASS 1、简介 2、相关文档 3、使用前奏 4、使用变量 5、嵌套规则 6、父级选择器标识 & 前言…

Linux基本指令(下)——“Linux”

各位CSDN的uu们好呀&#xff0c;今天&#xff0c;小雅兰的内容仍然是Linux中的基本指令啦&#xff0c;下面&#xff0c;让我们进入Linux的世界吧&#xff01;&#xff01;&#xff01; Cal指令 find指令&#xff1a;&#xff08;灰常重要&#xff09; -name grep指令 zip/un…

【置顶】关于博客的一些公告

所谓 万事开头难&#xff0c;最开始的两个专栏 《微机》 和 《骨骼动作识别》 定价 29.9 &#xff0c;因为&#xff1a; 刚开始确实比较困难&#xff0c;要把自己学的知识彻底搞懂讲给别人&#xff0c;还要 码字排版&#xff0c;从 Markdown 语法开始学起&#xff08;这都是 花…

机器学习基础-手写数字识别

手写数字识别&#xff0c;计算机视觉领域的Hello World利用MNIST数据集&#xff0c;55000训练集&#xff0c;5000验证集。Pytorch实现神经网络手写数字识别感知机与神经元、权重和偏置、神经网络、输入层、隐藏层、输出层mac gpu的使用本节就是对Pytorch可以做的事情有个直观的…

leetcode 139. 单词拆分

39. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s "leetcode"…

java学习--day24(stream流)

文章目录 今天的内容1.Stream【难点】1.1获取流的对象1.2Stream流对象下面1.2.1count和forEach1.2.2filter方法1.2.3limit1.2.4map方法1.2.5skip1.2.6concat 1.3收集流 1.基于接口和抽象类的匿名内部类的写法 abstract class Person {public abstract void eat(); } public sta…

Pytorch因nn.Parameter导致实验不可复现的一种情况

文章首发见博客&#xff1a;https://mwhls.top/4871.html。 无图/格式错误/后续更新请见首发页。 更多更新请到mwhls.top查看 欢迎留言提问或批评建议&#xff0c;私信不回。 没解决&#xff0c;只是记录这种情况。 也可以多次实验取均值以避免结果复现。 场景 自己的模块中&a…

Hadoop2.0探讨

文章目录 8. Hadoop 再探讨8.1 Hadoop的优化与发展8.2 HDFS 的FA和Federation(Hadoop2.0新特性)8.2.1 HDFS HA8.2.2 HDFS Federation 8.3 YARN8.3.1 MapReduce1.0的缺陷8.3.2 Yarn设计思路8.3.3 Yarn体系结构8.3.4 Yarn工作流程8.3.5 Yarn框架和MapReduce1.0框架对比分析8.3.6 …

#力扣:206. 反转链表@FDDLC

206. 反转链表 一、Java class Solution {public ListNode reverseList(ListNode head) {if (head null) return null;ListNode pre null, cur head, next head.next;while (next ! null) {cur.next pre;pre cur;cur next;next cur.next;}cur.next pre;return cur;}…

〖程序员的自我修养 - 认知剖析篇⑤〗- 选择前端还是后端?

人之所以会觉得迷茫,本质上是欠缺对自己的一个控制力、识别庞杂信息、去伪存真的独立思考与认知能力。 说明:该文属于 程序员的自我修养 专栏,购买任意白宝书体系化专栏可加入易编程社区,早鸟价订阅模式除外。福利:加入社区的小伙伴们,除了可以获取博主所有付费专栏的阅读…

【Java 进阶篇】CSS 选择器详解

CSS&#xff08;层叠样式表&#xff09;是一种用于描述网页上元素样式的语言。要想有效地使用CSS&#xff0c;了解CSS选择器是至关重要的&#xff0c;因为它们允许你选择要应用样式的HTML元素。在本文中&#xff0c;我们将详细介绍CSS选择器的各种类型和用法&#xff0c;以便你…