29-Golang中的切片
Golang中的切片
- 基本介绍
- 切片在内存中的形式
- 切片使用的三种方式
- 方式一:
- 方式二:
- 方式三:
- 切片使用的区别
- 切片的遍历
- 切片注意事项和细节说明
- append函数
- 切片的拷贝操作
- string和slice
基本介绍
- 1.切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制
- 2.切片的使用和数组类型,遍历切片、访问切片的元素和求切片长度len(slice)都是一样
- 3.切片的长度是可以变化的,因此切片是一个可以动态变化数组
- 4.切片定义的基本语法:
- var 变量名 [] 类型, 比如: bar a [] int
package main
import ("fmt")func main() {var intArr [5]int = [...]int{1, 33, 22, 55, 66}//slice就是切片名//intArr[1:3]表示slice引用到intArr这个数组//引用intArr数组的起始下标为1, 最后的下标为3(但是不包含3)slice := intArr[1:3]fmt.Println("intArr=", intArr)fmt.Println("slice 的元素是:", slice)fmt.Println("slice 的元素个数是:", len(slice))fmt.Println("slice 的容量", cap(slice)) //切片的容量是可以动态变化的 }
/*
intArr= [1 33 22 55 66]
slice 的元素是: [33 22]
slice 的元素个数是: 2
slice 的容量 4
*/
切片在内存中的形式
- 切片底层的数据结构可以理解成是一个结构体struct
- 切片确实是一个引用类型

切片使用的三种方式
方式一:
定义一个切片,然后让切片去引用一个已经创建好的数组,前面的案例就是这样的
方式二:
通过make来创建切片
基本语法:var 切片名 []type = make([], len, [cap])
package main
import ("fmt")func main() {var slice []int = make([]int, 4, 10)fmt.Println(slice) //默认值为0fmt.Println("slice len=", len(slice), "slice cap=", cap(slice))slice[0] = 100slice[2] = 200fmt.Println(slice)
}
/*
[0 0 0 0]
slice len= 4 slice cap= 10
[100 0 200 0]
*/
总结:
- 1.通过make方式创建切片可以指定切片的大小和容量
- 2.如果没有给切片的各个元素赋值,那么就会使用默认值
- 3.通过make方式创建的切片对应的数组的有make底层维护,对外不可见,只能通过slice去访问各个元素
方式三:
定义一个切片,直接就指定具体数组,使用原理类似make的方式
func main(){var slice []int = []int {1, 3, 5}fmt.Println(slice)
}
切片使用的区别
- 方式一是直接引用数组,这个数组是事先存在的,程序员可见的
- 方式二是通过make来创建切片,make也会创建一个数组,是有切片在底层进行维护,程序员是看不见的
切片的遍历
package main
import ("fmt")func main() {//使用常规的for循环遍历切片var arr [5]int = [...]int{4, 5, 6, 7, 8}slice := arr[1:4]for i :=0; i < len(slice); i++ {fmt.Printf("slice[%v]=%v ", i, slice[i])}fmt.Println()//使用for-range方式切片for i, v := range slice {fmt.Printf("i=%v v=%v ", i, v)}
}//slice[0]=5 slice[1]=6 slice[2]=7
//i=0 v=5 i=1 v=6 i=2 v=7
切片注意事项和细节说明
- 切片初始化时 var slice = arr[startindex:endindex]
- 说明:从arr数组下标为startindex,取到endindex的元素(不含arr[endindex])
- 切片初始化时,任然不可以越界。范围在[0-len(arr)之间],但是可以动态增长
- var slice = arr [0:end]可以简写:var slice = arr [:end]
- var slice = arr[start:len(arr)]可以简写:var slice = arr[start:]
- var slice = arr[0:len(arr)]可以简写:var slice = arr[:]
- cap是一个内置函数,用于统计切片的容量,即最大可以存放多少个元素
- 切片定义完后,还不能使用,因为本省是一个空的,需要让其引用到一个数组,或者make一个空间供切片来使用
- 切片可以继续切片
append函数
用append内置函数,可以对切片进行动态追加
package main
import ("fmt")func main() {var slice []int = []int{100, 200, 300}//通过append直接给slice追加具体的元素slice = append(slice, 400, 5000)fmt.Println("slice", slice)//通过append将切片slice追加给sliceslice = append(slice, slice...)fmt.Println("slice", slice)
}
/*
slice [100 200 300 400 5000]
slice [100 200 300 400 5000 100 200 300 400 5000]
*/
底层原理分析
1.切片append操作的本质就是对数组扩容
2.go底层会创建一下新的数组newArr(安装扩容后大小)
3.将slice原来包含的元素拷贝到新的数组newArr
4.slice重新引用到newArr
5.注意newArr是在底层来维护的,程序员不可见

切片的拷贝操作
copy(para1,para2)参数的数据类型是切片
由下面的案例可知,slice1和slice2的数据空间是独立,相互不影响,也就是说slice[0]=999,slice2[0]任是1
package main
import ("fmt")func main() {var slice1 []int = []int{1, 2, 3, 4, 5}var slice2 = make([]int, 10)copy(slice2, slice1)fmt.Println("slice1", slice1)fmt.Println("slice2", slice2)
}/*
slice1 [1 2 3 4 5]
slice2 [1 2 3 4 5 0 0 0 0 0]
*/
string和slice
- slice底层是一个byte数组,因此string也可以进行切片处理
- sting是不可变的,也就是说不能通过str[0]='z’方式来修改字符串
- 如果需要修改字符串,可以先将string->[]byte/或者[]rune->修改->重写转成string
package main
import ("fmt")func main() {str := "hello@wings"//使用切片获取内容slice := str[6:]fmt.Println("slice=", slice)//[]byte可以处理英文和数字但是不能处理中文//[]rune是按照字符处理,兼容汉字arr1 := []byte(str)arr1[0] = 'z'str = string(arr1)fmt.Println("str=", str)
}//slice= wings
//str=zhello@wings

相关文章:
29-Golang中的切片
Golang中的切片基本介绍切片在内存中的形式切片使用的三种方式方式一:方式二:方式三:切片使用的区别切片的遍历切片注意事项和细节说明append函数切片的拷贝操作string和slice基本介绍 1.切片是数组的一个引用,因此切片是引用类型…...
闲聊一下开源
今天看了下中国开源开发者报告,感觉收货不少,针对里面的内容,我也加入一些自己的理解,写下来和大家一起闲聊一下。 AI 时至今日,我说一句AI已经在我国几乎各个行业都能找到应用,应该没人反对吧࿱…...
用这4招优雅的实现Spring Boot 异步线程间数据传递
Spring Boot 自定义线程池实现异步开发相信大家都了解,但是在实际开发中需要在父子线程之间传递一些数据,比如用户信息,链路信息等等 比如用户登录信息使用ThreadLocal存放保证线程隔离,代码如下: /*** author 公众号…...
RocketMQ源码分析之NameServer
1、RocketMQ组件概述 NameServer NameServer相当于配置中心,维护Broker集群、Broker信息、Broker存活信息、主题与队列信息等。NameServer彼此之间不通信,每个Broker与集群内所有的Nameserver保持长连接。 2、源码分析NameServer 本文不对 NameServer 与…...
如何优化认知配比
战略可以归结为三种要素的合理配比。我们对战略的一个定义是:在终局处的判断。这其实来自于一个宗教的命题——面死而生。死是终局,生是过程,当你想做一个思想实验,或者是你真的有缘能够直面死亡,你所有关于生的认知就…...
WuThreat身份安全云-TVD每日漏洞情报-2023-02-15
漏洞名称:TOTOLINK A7100RU 安全漏洞 漏洞级别:严重 漏洞编号:CVE-2023-24276,CNNVD-202302-367 相关涉及:TOTOlink A7100RU(V7.4cu.2313_B20191024)路由器 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-02977 漏洞名称:Windows NTLM 特权提…...
Unreal Engine角色涌现行为开发教程
在本文中,我将讨论如何使用虚幻引擎、强化学习和免费的机器学习插件 MindMaker 在 AI 角色中生成涌现行为。 目的是感兴趣的读者可以使用它作为在他们自己的游戏项目或具体的 AI 角色中创建涌现行为的指南。 推荐:使用 NSDT场景设计器 快速搭建 3D场景。…...
vue处理一千张图片进行分页加载
vue处理一千张图片进行分页加载 开发过程中,如果后端一次性返回你1000多条图片或数据,那我们前端应该怎么用什么思路去更好的渲染呢? 第一种:我们可以使用分页加载 第二种:我们可以进行懒加载那我们用第一种方法使用…...
(三十三)Vue之消息订阅与发布
文章目录消息订阅与发布理解使用步骤改造TodoList为消息订阅与发布上一篇:(三十二)Vue之全局事件总线 消息订阅与发布 理解 这种方式的思想与全局事件总线很相似,一种组件间通信的方式,适用于任意组件间通信。 它包…...
Http中你必须知道那点事
1, HTTP 1.1 简介 HTTP概念 HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。 数据传输的规则指的是请求数据和响应数据需要按照指定的格式进行传输。如果想知道具体的格式,可以打开浏览器…...
ViewBinding使用入门
ViewBinding 参考资料: 新技术 ViewBinding 最佳实践 & 原理击穿 更多 ViewBinding 的封装思路 1. kotlin-android-extensions(KAE) 的问题 根据Google官方的说法, KAE存在以下问题: 污染全局命名空间不能暴露可空性信息仅支持Kotlin代码 kotlin在1.4.20中 开始废弃这…...
Retrofit源码分析实践(七)【Retrofit ConvertFactory的功能实现】
Retrofit源码分析&实践系列文章目录 Retrofit源码分析&实践(一)【从使用入手分析源码】Retrofit源码分析&实践(二)【Retrofit 免费的api测试工具引入】Retrofit源码分析&实践(三)【Retrofit 代码框架搭建】Retrofit源码分析&实践(四)【Retrofit 实…...
介电常数常用测量方法综述
张扬1,徐尚志1,赵文晖2,龚增2,赵晓群1 1同济大学,上海 2上海市计量测试技术研究院,上海 在设计电路、天线、电容器等过程中经常会涉及所用材料的介电常数, 所以深入了解介电常数的相关概念对实际工作有重…...
重生之我是赏金猎人(三)-SRC漏洞挖掘-强行多次FUZZ发现某厂商SSRF到redis密码喷洒批量反弹Shell
0x00 前言 https://github.com/J0o1ey/BountyHunterInChina 欢迎大佬们点个star 最近BugBounty挖了不少,但大多数都是有手就行的漏洞,需要动脑子的实属罕见 而今天就遇到了一个非常好的案例,故作此文 0x01 对目录批量FUZZ,发…...
学会分享,学会生活,分享5款简单易用的软件。
分享是一种博爱的心境,学会分享,就学会了生活。 1.在线图片编辑工具——佐糖 佐糖是一款在线免费图片编辑工具,采用AI人工智能技术,自动识别图片,支持一键抠图,更换背景,移除水印等。另外还提…...
Redux 与 Vuex 的区别总结
Redux 工作流程 首先,用户(通过 view)发送 Action,发送方式就用到了 dispatch 方法。然后,Store 自动调用 Reducer,并传入俩个参数,当前 State 和 收到的 Action。而 Reducer 会返回新的 State。最后,Store 根据接收到的 State,判断是否发生变化。一旦发生变化,Store…...
QT(15)- QFile
1 函数 1.1 copy bool QFile::copy(const QString &newName) QFile::copy(const QString &newName) 是 Qt 中用于复制文件的函数,将 fileName() 所指向的文件复制到 newName 指定的新位置。 在复制文件之前,源文件会先被关闭。如果被复制的文…...
GaiaX开源解读 | 表达式作为逻辑动态化的基础,我们是如何设计的
GaiaX跨端模板引擎,是在阿里优酷、淘票票、大麦内广泛使用的Native动态化方案,其核心优势是性能、稳定和易用。本系列文章《GaiaX开源解读》,带大家看看过去三年GaiaX的发展过程。 前言 GaiaX【https://github.com/alibaba/GaiaX】是由优酷应…...
python中adb shell相关操作
1、python 实现adb交互,进入adb shell后,如何再发送消息 os.popen("adb -s 192.168.1.100:5555 shell \"dmesg > /data/dmesg.log\"")进入进入adb shell,在执行 dmesg > /data/dmesg.log 2、python(或BAT脚本)自…...
python 之 资源使用与控制 resource模块
一、背景 2021年做可信计算时,由于甲方给的CPU利用率不能不能超过20%; 目的:我们的程序部署甲方服务器上不能阻碍其甲方服务的正常运行 我们的程序在CPU超过20%时,可以休眠几秒后继续运行 此时需要检测控制服务器的CPU资源使用信…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
