GoLang切片
一、切片基础
1、切片的定义
- 切片(Slice)是一个拥有相同类型元素的可变长度的序列
- 它是基于数组类型做的一层封装
- 它非常灵活,支持自动扩容
- 切片是一个引用类型,它的内部结构包含地址、长度和容量
- 声明切片类型的基本语法如下:
- var name []T
- name:表示变量名
- T:表示切片中的元素类型
package mainimport "fmt"func main() {//切片是引用类型,不支持直接比较,只能和 nil 比较var a []string //声明一个字符串切片fmt.PrintIn(a) //[]fmt.PrintIn(a == nil) //truevar b = []int{} //声明一个整型切片并初始化fmt.PrintIn(b) //[]fmt.PrintIn(b==nil) //falsevar c = []bool{false,true}fmt.PrintIn(c) //[false true]fmt.PrintIn(c == nil) //false
}
- 切片之间是不能比较的,我们不能使用--操作符来判断两个切片是否含有全部相等元素
- 切片唯一合法的比较操作是和 nil 比较。一个 nil 值的切片并没有底层数组,一个 nil 值的切片的长度和容量都是 0
- 但是我们不能说一个长度和容量都是 0 的切片一定是 nil
2、关于 nil 的认识
- 当你声明了一个变量,但却还并没有赋值是,golang 中自动给你的变量赋值一个默认零值
- 这是每种类型对应的零值
bool->false
numbers->0
string->""
pointers->nil
slices->nul
maps->nil
channels->nil
functions->nil
interfaces->nil
3、切片的本质
- 切片的本质就是对底层数组的封装,他包含了三个信息:底层数组的指针、切片的长度(len)和切片的容量(cap)
- 举个例子,现在有一个数组 a:=[8]int{0,1,2,3,4,5,6,7},切片s1:=a[:5],相应示意图如下。
- 切片s2:=a[3:6],相应示意图如下
4、切片的扩容策略
- 首先判断,如果新申请容量(cap)大于 2 倍的就容量(old.cap),最终容量(newcap)就是新申请的容量(cap)
- 否则判断,如果旧切片的长度小于 1024,则最终容量(newcap)就是旧容量(old.cap)的两倍,即(newcap=doublecap)
- 否则判断,如果旧切片长度大于等于 1024,则最终容量(newcap)从旧容量(old.cap)开始循环怎么感觉原来的1/4,即(newcap=old.cap,for{newcap+= newcap/4})直到最终容量newcap)大于等于新申请的容量(cap),即(newcap >= cap)
- 如果最终容量(cap)计算值溢出,则最终容量 cap 就是新申请容量(cap)
5、切片的长度和容量
- 切片拥有自己的长度和容量,我们可以通过使用内置的**len()**函数求长度,使用内置的**cap()**函数求切片的容量
- 切片的长度就是它所包含的元素个数
- 切片的容量是从它的第一个元素开始数,到其底层数组元素末尾的个数
- 切片 s 的长度和容量可通过表达式 len(s)和 cap(s)来获取
package mainimport "fmt"func main(){s:=[]int{2,3,5,7,11,13}fmt.Printf("长度:%v 容量%v\n",len(s),cap(s)) //长度:6 容量 6c := s[:2]fmt.PrintIn(c) //[2 3]fmt.Printf("长度:%v 容量 %v\n",len(c),cap(c)) //长度 2 容量 6d :=s[1:3]fmt.PrintIn(d) //[3 5]fmt.Printf("长度:%v 容量%v",len(d),cap(d)) //长度:2 容量 5
}
二、切片循环
- 切片的循环遍历和数组的循环遍历是一样的
1、基本遍历
package mainimport "fmt"func main(){var a = []string{"北京","上海","深圳"}for i:=0;i<len(a);i++{fmt.PrintIn(a[i])}
/*
北京
上海
深圳*/
}
2、k,v 遍历
package mainimport "fmt"func main() {var a = []string{"北京", "上海", "深圳"}for index, value := range a {fmt.Println(index, value)}
}
/*
0 北京
1 上海
2 深圳*/
三、定义切片
1、数组定义切片
- 由于切片的底层就是一个数组,所以我们可以基于数组定义切片
package mainimport "fmt"func main() {a := [5]int{55,56,57,58,59} //基于数组定义切片b := a[1:4]fmt.PrintIn(b) // [56 57 58]fmt.Printf("type of b:%T\n",b) //type of b:[]intc := b[0:2]fmt.PrintIn(c) //[56 57]
}
2、make()构造切片
- 我们上面都是基于数组来来创建的切片,如果需要动态的创建一个切片,我们就需要使用内置的make()函数
- 格式如下:make([]T,size,cap)
- T:切片的元素类型
- size:切片中元素的数量
- cap:切片的容量
package mainimport "fmt"func main() {a := make([]int,2,10)fmt.PrintIn(a) //[0 0]fmt.PrintIn(len(a)) // 2fmt.PrintIn(cap(a)) //10
}
- 在上面代码a的内部存储空间已经分配了10个,但实际上只用了2个
- 容量并不会影响当前元素的个数,所以len(a)返回2,cap(a)则返回该切片的容量
四、append()
- Go语言的聂键函数append()可以为切片动态添加元素,每个切片会指向一个底层数组
- 这个数组的容量够用就添加新增元素
- 当底层数组不能容纳新增的元素时,切片就会自动按照一定的策略进行“扩容”,此时该切片指向的底层数组就会更换
- “扩容”操作往往发送在append()函数调用时,所以我们通常都需要用原变量接收append()函数的返回值
1、append添加
package mainimport "fmt"func main() {//append()添加元素和切片扩容var numSlice []intfor i :=0;i<10;i++ {numSlice =append(numSlice,i)fmt.Printf("%v len:%d cap:%d ptr:%p\n",numSlice,len(numSlice),cap(numSlice),numSlice)}
}
2、append追加多个
package mainimport "fmt"func main() {var citySlice []stringcitySlice = append(citySlice,"北京") //追加一个元素citySlice = append(citySlice,"上海","杭州","深圳") //追加多个元素a := []string{"成都","重庆"}citySlice = append(citySlice,a...) //追加切片fmt.PrintIn(citySlice) //[北京 上海 杭州 深圳 成都 重庆]
}
3、切片中删除元素
- Go语言中并没有删除切片元素的专用方法,我们可以使用切片本身的特性来删除元素
package mainimport "fmt"func main() {a := int{30,31,32,33,34,35,36,37}a = append(a[:2],a[3:]...) //要删除索引为2的元素fmt.PrintIn(a) //[30 31 33 34 35 36 37]
}
4、切片合并
package mainimport "fmt"func main() {arr1 :=[]int{2,7,1}arr2 :=[]int{5,9,3}fmt.PrintIn(arr2,arr1)arr1 = append(arr1,arr2...)fmt.PrintIn(arr1) //[2 7 1 5 9 3]
}
五、copy()
1、引用问题
package mainimport "fmt"func main() {a := []int{1,2,3,4,5}b :=afmt.PrintIn(a) //[1 2 3 4 5]fmt.PrintIn(b) //[1 2 3 4 5]b[0] = 1000fmt.PrintIn(a) //[1000 2 3 4 5]fmt.Println(b) //[1000 2 3 4 5]
}
2、copy()函数
- Go语言内建的copy()函数可以迅速地将一个切片的数据复制到另外一个切片空间中
- copy()函数的使用格式如下:copy(destSlice,srcSlice [] T)
- 其中
- srcSlice:数据来源切片
- destSlice:目标切片
package mainimport "fmt"func main() {a := []int{1,2,3,4,5}c := make([]int,5,5) //[0 0 0 0 0]copy(c,a) //使用copy函数将切片a中的元素复制到切片cfmt.Println(a) //[1 2 3 4 5]fmt.Println(c) //[1 2 3 4 5]c[0] = 1000fmt.Println(a) //[1 2 3 4 5]fmt.Println(c) //[1000 2 3 4 5]
}
六、sort()
1、正序排序
- 对于int、float64和string数组或是切片的排序
- go分别提供了sort.Ints()、sort.Float64s()和sort.Strings()函数,默认都是从小到大排序
pacakge mainimport {"fmt""sort"
}func main() {intList := []int{2, 4, 3, 5, 7, 6, 9, 8, 1, 0}sort.Ints(intList)fmt.Println(intList) // [0 1 2 3 4 5 6 7 8 9]stringList := []string{"a", "c", "b", "z", "x", "w", "y", "d", "f", "i"}sort.Strings(stringList)fmt.Println(stringList) // [a b c d f i w x y z]
}
2、sort降序排序
- Golang的sort 包 可 以 使 用 sort.Reverse(slice) 来 调 换slice.Interface.Less
- 也就是比较函数,所以, int 、 float64 和 string的逆序排序函数可以这么写
package main
import ("fmt""sort"
)
func main() {intList := []int{2, 4, 3, 5, 7, 6, 9, 8, 1, 0}sort.Sort(sort.Reverse(sort.IntSlice(intList)))fmt.Println(intList) // [9 8 7 6 5 4 3 2 1 0]stringList := []string{"a", "c", "b", "z", "x", "w", "y", "d", "f", "i"}sort.Sort(sort.Reverse(sort.StringSlice(stringList)))fmt.Println(stringList) // [z y x w i f d c b a]
}
相关文章:

GoLang切片
一、切片基础 1、切片的定义 切片(Slice)是一个拥有相同类型元素的可变长度的序列它是基于数组类型做的一层封装它非常灵活,支持自动扩容切片是一个引用类型,它的内部结构包含地址、长度和容量声明切片类型的基本语法如下&#…...

前端入门(四)Ajax、Promise异步、Axios通信、vue-router路由、组件库
文章目录 AjaxAjax特点 Promise 异步编程(缺)Promise基本使用状态 - PromiseState结果 - PromiseResult AxiosVue中使用AxiosAxios请求方式getpostput和patchdelete并发请求 Vue路由 - vue-router单页面Web应用(single page web application&…...

正则表达式回溯陷阱
一、匹配场景 判断一个句子是不是正规英文句子 text "I am a student" 一个正常的英文句子如上,英文单词 空格隔开 英文单词 多个英文字符 [a-zA-Z] 空格用 \s 表示 那么一个句子就是单词 空格(一个或者多个,最后那个单词…...

MATLAB实战 | S函数的设计与应用
S函数用于开发新的Simulink通用功能模块,是一种对模块库进行扩展的工具。S函数可以采用MATLAB语言、C、C、FORTRAN、Ada等语言编写。在S函数中使用文本方式输入公式、方程,非常适合复杂动态系统的数学描述,并且在仿真过程中可以对仿真进行更精…...

Day41 使用listwidget制作简易图片播放器
1.简介 使用QlistWidget实现简易图片播放器,可以打开一个图片序列,通过item的单击事件实现图片的切换,通过设置list的各种属性实现图片预览的显示,美化滚动条即可实现一个简易图片播放器。 2.效果 3.实现步骤: 1.初始…...

matlab 基于卡尔曼滤波的GPS-INS的数据融合的导航
1、内容简介 略 25-可以交流、咨询、答疑 2、内容说明 基于卡尔曼滤波的GPS-INS的数据融合的导航 "基于卡尔曼滤波的GPS-INS的数据融合的导航 基于卡尔曼滤波实现GPS-INS组合导航系统" 卡尔曼滤波、GPS、INS、数据融合、导航 3、仿真分析 4、参考论文 略 …...

vivado实现分析与收敛技巧6-策略建议
典型时序收敛策略需运行大量实现策略并选取其中最佳的策略以供在实验室内应用。 ML 策略同样可选 , 且只需您运行3 项策略即可达成类似的 QoR 收益。这些策略使用机器学习来检验布线后设计的各项功能特性 , 以便预测相同设计上不同策略的性能。在 repo…...

SOCKET、TCP、HTTP之间的区别与联系
SOCKET、TCP、HTTP之间的区别与联系 一、 Socket 1、什么是socket2、为什么需要socket3、建立socket连接 二、HTTP(基于TCP) 1、HTTP的概念2、HTTP连接的特点 连接请求:一次连接连接请求:短连接(socket是长连接) 三、TCP/IP协议簇 四、HTTP、Socket…...
javascript的Proxy
1. 什么是Proxy Proxy是ES6中新增的一个特性,它可以拦截对象的操作,提供了一个中间层来控制对目标对象的访问。简单来说,它可以对对象进行代理,从而实现对对象的监控、修改、过滤等操作。 2. 为什么出现Proxy 在JavaScript中&a…...
Python发送微信模板消息
1、根据appid,secret获取token 2、查找粉丝 3、指定模板及粉丝id发送模板消息 4、链接SqlServer数据库获取消息任务 5、创建定时任务监听消息 from logging import exception import time import pymysql import datetime; from utils.http_utils import *; from model.msg_wx_…...
springboot(ssm医院门诊信息管理系统 医院管理平台Java(codeLW)
springboot(ssm医院门诊信息管理系统 医院管理平台Java(code&LW) 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0&am…...

css所有属性介绍
文章目录 1️⃣ CSS属性介绍1.1 CSS3 动画属性(Animation)1.2 CSS 背景属性(Background)1.3 CSS 边框属性(Border 和 Outline)1.4 Box 属性1.5 Color 属性1.6 Content for Paged Media 属性1.7 CSS 尺寸属性…...

C#语言高阶开发
目录 数据结构 集合 动态数组ArrayList 习题:声明一个Monster类,有一个Attack方法,用一个ArrayList去封装Monster的对象,装10个,遍历monster的list让他们释放攻击方法 哈希表HashTable 创建一个武器类,有一个属性叫做id,每个…...
使用Qt Designer设计水平布局,加addStretch()不起作用,解决办法?
解决办法: 将main函数中的MainWindow.show()改为:ui.show() if __name____main__:app QApplication(sys.argv)MainWindow QMainWindow()ui Ui_MainWindow()ui.setupUi(MainWindow)ui.show()app.exec()完整代码: import sysfrom PyQt5 i…...

数据结构:带头双向循环链表的实现
引言 单链表存在缺陷:需要从头开始找前一个节点 解决方法:双向链表 链表的结构(8种): 1. 单向,双向 2. 带头、不带头 带头即为带哨兵位的头节点,第一个节点不存储有效数据。带头节点&#…...

最小生成树(Minimum Spanning Tree)及生成MST的几种方法
最小生成树 (Minimum Spanning Tree) 最小生成树是图论领域的一个基本概念,适用于加权连通图,其中包括若干顶点(节点)以及连接这些顶点的边(边可以有权重)。在一个加权连通图中,生成树…...

逻辑漏洞 暴力破解(DVWA靶场)与验证码安全 (pikachu靶场) 全网最详解包含代码审计
逻辑漏洞 暴力破解(DVWA靶场)与验证码安全 (pikachu靶场) 全网最详解包含代码审计 0x01 前言 在当今互联网的广袤世界中,各式交互平台层出不穷。每一个交互平台几乎都要求用户注册账号,而这些账号则成为我们在数字世界中的身份象征。账号的安全性变得至…...

io基础入门
压缩的封装 参考:https://blog.csdn.net/qq_29897369/article/details/120407125?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-120407125-blog-120163063.235v38pc_relevant_sort_base3&spm1001.2101.3001.…...

k8s ingress 无法找到端点
文章目录 ingress rule无法找到端点这个注解是什么意思呢?为何不生效呢?端点无法更新?如何确认ingressclass呢?修复端点无法发现的问题多个ingress controller 架构 ingress rule无法找到端点 在vnnox-cn集群创建ingress…...

properties转yml
目前搜索到的大部分代码都存在以下问题: 复杂结构解析丢失解析后顺序错乱 所以自己写了一个,经过不充分测试,基本满足使用。可以直接在线使用 在线地址 除了yml和properties互转之外,还可以生成代码、sql转json等,可…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...