切片注意事项和细节(1) | 学习笔记

简介: 简介:快速学习切片注意事项和细节(1)

开发者学堂课程【Go 语言核心编程 - 基础语法、数组、切片、Map :切片注意事项和细节(1)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/625/detail/9640


切片注意事项和细节(1)

 

一、切片注意事项和细节讨论

1、切片初始化时 var slice = arr[startIndex:endIndex]  (如果让一个切片直接引用一个已经存在的数组,它应该要有两个参数)

说明:从 arr 数组下标为 startlndex,取到下标为 endIndex 的元素(不含 arr[endIndex])。

2、切片初始化时,仍然不能越界。范围在[0-len(arr)]之间,但是可以动态增长。(在使用时,默认情况下这个切片按默认用法)

例如:

func main() {

//使用常规的for循环遍历切片

var arr [5]int = [...]int{10,20,30,40,50}

slice := arr[1:4]  // 第四个元素没有取到,一共有三个元素,分别是20,30,40;

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 \n", i,v)

}

fmt.Printf(slice[])   //因为只有三个元素,只能取0,1,2,;如果取到3,它便会报告越界

}

运行结果如下:

image.png

“index out of range”表示已越界;因为引用时没有引用到数组的最后一位元素,所以报错

(1) var slice = arr[0:end] 可以简写 var slice = arr[:end] //用一个切片去引用已经存在的数组,它有几种写法:例如 arr[0:end],如果起始的值为0,便可简写成arr[:end]

(2) var slice = arr[start:len(arr)] 可以简写: var slice = arr[start:]  //如果起始是[start:len(arr)],也就是从起始位置取到末尾,一般情况下 len 是数组长度,而不包含数组长度就相当于把数组取完,所以这样便可以简写为 arr[start:]。后面的值便可不写,因为后面的值默认是数组的长度

(3) var slice = arr[0:len(arr)]可以简写:var slice = arr[:]

//如果默认把整个数组取下来,也就是需要一个切片把某个数组从第0个元素引用到它最后一个元素例如[0:len(arr)],便可以简写为 arr[:],其中 arr[:]第一个空默认是0,第二个空默认是 len(arr)

例如:

func main() {

//使用常规的for循环遍历切片

var arr [5]int = [...]int{10,20,30,40,50}

slice := arr[0:len(arr)]  //取整个数组的元素

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 \n", i,v)

}

运行结果如下:

image.png

结果显示取出5个元素,所以这种写法(slice := arr[0:len(arr)])

也可以简写成 slice := arr[:],这样运行结果与之前一样

3、cap 是一个内置函数,用于统计切片的容量,即最大可以存放元素个数。

4、切片定义完后,还不能使用,因为本身是一个空的,需要让其引用到一个数组,或者 make 一个空间供切片来使用  //也就是定义完一个切片后,要么引用到一个数组里去,要么 make 一个空间来供切片使用,否则它是空的

5、切片可以继续切片

[案例演示]:
func main( i

//使用常规的for循环遍历切片

var arr [5]int = [...]int{10,20,30,40,50}

slice := arr[1:4]  //slice是一个切片,需要再切一块也可以

for i := e; 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=x\n",i,v)

}

(1)slice2 := slice[1:2]   //体现切片可以再次切片,从 slice 的第一个元素切到第二个元素;这时 slice2 也是一个切片,这样切相当于在原来切片基础上再切了一个元素出来,实际上就是20;因为原先 slice={10,20,30,40,50},然后从中切取下标为1切到下标为2 即是20;slice 和 slice2 都指向同一个数据空间;也就是说 slice2 改变了slice 也会同时变化,同时数组也会变化,因为他们都是引用类型的

运行结果如下:

image.png

//slice2 运行出来的元素是[20]

(2)如果将以上代码中 slice2 := slice[1:2]改为 slice2 := slice[2:4]那么取得元素则为[30,40]

(3)如果将以上代码中

将 slice := arr[:]改为 slice := arr[1:4]

那么这是 slice2 取多少?

首先找出 slice={20,30,40},然后找出 slice 中的第一个和第二个元素

运行结果如下:

image.png

(4) 如果 slice2[0]=100(slice2的第0个元素,将它改成100),请问 slice 和 arr 的数组是否会发生变化?

slice2[0] = 100  //不管是通过数组还是 slice 来看,都会变成100;因为 arr , slice  和 slice2 指向同一个数据空间,,因此 slice2[0]=100,其他的都变化      

fmt.Println( "slice2=", slice2)

fmt.Println("slice=", slice)

fmt.Println("arr=", arr)

//现在输出的 slice2、slice、arr 对应的30都变成了100

}

运行结果如下:

image.png

相关文章
|
网络协议 Shell 网络安全
ssh: connect to host github.com port 22: Connection refused
本文讨论了在使用Git命令操作GitHub时遇到的"ssh: connect to host github.com port 22: Connection refused"错误,分析了可能的原因,并提供了使用443端口或https协议作为解决方案,最终确定问题是由于DNS解析错误导致,通过修改hosts文件解决。
ssh: connect to host github.com port 22: Connection refused
|
存储 Prometheus Cloud Native
prometheus学习笔记之PromQL
prometheus学习笔记之PromQL
|
算法 Serverless 知识图谱
0基础理解ECC并做题-攻防世界easy-ECC理解
0基础理解ECC并做题-攻防世界easy-ECC理解
|
存储 缓存 大数据
深入了解Linux文件系统
了解Linux文件系统的关键概念,包括其作为OS与硬件接口的角色,以及ext4、XFS、Btrfs、ZFS和JFS等常见类型。文件系统由超级块、inode和数据块组成,管理涉及创建、挂载、卸载及容量监控。性能优化可通过缓存策略、参数调整和碎片整理实现。文件系统安全依赖权限控制、加密和ACL。随着技术进步,新型文件系统将应对云计算和大数据的挑战。
375 3
|
前端开发 JavaScript API
提取网页所有链接免费API接口教程
此API用于提取指定网页内的所有链接信息并进行分类,支持POST和GET请求方式。需提供用户ID、KEY及目标网址等参数,可选指定访问节点。返回结果包括状态码、信息提示及各类链接集合,如图片、视频、文档等。示例中展示了请求格式与返回数据结构。
|
SQL 存储 安全
深入浅出:SQL数据库建表全过程详解
数据库是现代信息系统的核心组成部分,而SQL(结构化查询语言)则是管理和操作数据库的最主要工具之一。在创建数据库的过程中,建表是非常重要的一步,因为它决定了数据的存储结构和方式。本文将详细介绍SQL数据库建表的全过程,帮助读者更好地理解并掌握这一关键技术。一、了解数据库与表的基本概念在深入SQL数据
589 1
|
网络安全 开发工具 git
【git】解决git报错:ssh:connect to host github.com port 22: Connection timed out 亲测有效
【git】解决git报错:ssh:connect to host github.com port 22: Connection timed out 亲测有效
5482 1
|
Java 数据库连接 Maven
maven中scope值详解
maven中scope值详解
230 0
|
编解码 运维 安全
直播系统源码,系统分析篇:不可或缺的云转码系统
云转码系统作为直播系统源码平台不可或缺的系统之一,它的根据不同设备终端与网络状况等因素变换质量,让平台用户能够在不同的时间和地点享受到高清、低延迟的优质体验,并且可以在多种场景中起到关键的作用,云转码系统使直播系统源码平台具有广泛的应用前景和价值。
直播系统源码,系统分析篇:不可或缺的云转码系统
|
编解码
h264和h265编码所需要的处理器性能
h264和h265编码所需要的处理器性能
1941 0
h264和h265编码所需要的处理器性能