slice切片的四种声明定义方式,切片的截取、修改与追加
一、切片定义
定义切片
var identifier []type
切片不需要说明长度。 或使用make()函数来创建切片:
var slice1 []type = make([]type, len)
也可以简写为
slice1 := make([]type, len)
make([]T, length, capacity)
空切片:一个切片在未初始化之前默认为 nil,长度为 0
package mainimport "fmt"func main() {var numbers []intprintSlice(numbers)if(numbers == nil){fmt.Printf("切片是空的")}
}func printSlice(x []int){fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
完整代码:
package mainimport "fmt"func main() {//第一种::声明slice1是一个切片,并且初始化,默认值是1,2,3,长度是3//slice1 := []int{1, 2, 3}//第二种::声明一个slice1是一个切片,但是并没有给slice分配空间//var slice1 []int//这个时候如果写slice1【0】=1,就会报错,因为还没有给slice1分配空间//slice1[0] = 1,错误是:"runtime error: index out of range [0] with length 0"//通过make开辟空间//slice1 = make([]int, 3) //开辟三个容量,此时默认值是0//slice1[1] = 1000//第三种::声明一个slice1是一个切片,同时给slice分配3个空间,初始化为0//var slice1[]int=make([]int, 3)//或者用通过:=推导出slice是一个切片slice1 := make([]int, 3)//fmt.Printf("len = %d,slice = %v\n", len(slice1), slice1) //"%v表示打印所有信息"//判断一个slice是否为0if slice1 == nil {fmt.Println("slice是一个空切片")//第十行会是一个空切片} else {fmt.Println("slice不是一个空切片")//20行的可不是空切片}}
make(1,2,3):1.表示类型,2.表示长度,3.表示容量
二、切片追加
使用append进行追加,代码如下
package mainimport "fmt"func main() {var numbers = make([]int, 3, 5) //len=3,cap=5fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers)//想numbers追加一个元素1,len=4,cap=5numbers = append(numbers, 1)fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers)numbers = append(numbers, 2)//向一个满容cap的slice追加元素numbers = append(numbers, 3)fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers)//cap会扩大两倍
}
注意:当cap(容量)满了的时候再去追加,cap会自动变成原来的两倍。总结,如下图
三、切片截取
s := arr[startIndex:endIndex]
将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片(前闭后开),长度为endIndex-startIndex
s := arr[startIndex:]
缺省endIndex时将表示一直到arr的最后一个元素
s := arr[:endIndex]
缺省startIndex时将表示从arr的第一个元素开始
截取很简单的,直接看代码吧
package mainimport "fmt"func main() {s := []int{1, 2, 3} //len=3,cap=3s1 := s[0:2] //从索引下标0开始,左闭右开,也就是说截取index=0和1两个元素。即截取1,2fmt.Println(s1) //【1 2】//注意此时改变了s1的第一个值,s的值也会改变,因为他俩指定的同一块内存地址s1[0] = 100fmt.Println(s)fmt.Println(s1)//如果想不改变s的值,那么可以用copy进行拷贝s2 := make([]int, 3)copy(s2, s) //将s中的值拷贝给s2s2[0] = 100//fmt.Println(s) //[1 2 3]fmt.Println(s2) //[100 2 3]
}
当然我还演示了,如何在截取之后改变截取的值而不改变原切片的值
四、切片修改
slice没有自己的任何数据。它只是底层数组的一个表示。对slice所做的任何修改都将反映在底层数组中。
示例代码:
package mainimport ( "fmt"
)func main() { darr := [...]int{57, 89, 90, 82, 100, 78, 67, 69, 59}dslice := darr[2:5]fmt.Println("array before",darr)for i := range dslice {dslice[i]++}fmt.Println("array after",darr)
}
运行结果:
array before [57 89 90 82 100 78 67 69 59]
array after [57 89 91 83 101 78 67 69 59]
当多个片共享相同的底层数组时,每个元素所做的更改将在数组中反映出来。
示例代码:
package mainimport ( "fmt"
)func main() { numa := [3]int{78, 79 ,80}nums1 := numa[:] //creates a slice which contains all elements of the arraynums2 := numa[:]fmt.Println("array before change 1",numa)nums1[0] = 100fmt.Println("array after modification to slice nums1", numa)nums2[1] = 101fmt.Println("array after modification to slice nums2", numa)
}
运行结果:
array before change 1 [78 79 80]
array after modification to slice nums1 [100 79 80]
array after modification to slice nums2 [100 101 80]
总结:
切片Slice:
1.每一个切片引用了一个底层数组
2.切片本身不存储任何数据,都是这个底层数组存储,所以修改切片也就是修改这个数组中的数据
3.当向切片中添加数据时,如果没有超过容量,直接添加,如果超过容量,自动扩容(成倍增长)
4.切片一旦扩容,就是重新指向一个新的底层数组
slice切片的四种声明定义方式,切片的截取、修改与追加相关推荐
- 爆破专栏丨Spring Security系列教程之Spring Security的四种权限控制方式
原创:一一哥 前言: 在前面的章节中,一一哥 已经给大家介绍了Spring Security的很多功能,在这些众多功能中,我们知道其核心功能其实就是认证+授权. 在前面我们分别基于内存模型.基于默认的 ...
- java按钮权限控制_详解Spring Security 中的四种权限控制方式
Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Se ...
- ASP.NET MVC下的四种验证编程方式[续篇]
ASP.NET MVC下的四种验证编程方式[续篇] 原文:ASP.NET MVC下的四种验证编程方式[续篇] 在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET ...
- java 按钮 监听_Button的四种监听方式
Button按钮设置点击的四种监听方式 注:加粗放大的都是改变的代码 1.使用匿名内部类的形式进行设置 使用匿名内部类的形式,直接将需要设置的onClickListener接口对象初始化,内部的onC ...
- python接口自动化(十)--post请求四种传送正文方式(详解)
简介 post请求我在python接口自动化(八)–发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先了 ...
- 单片机的四种烧写方式
参考:单片机的四种烧写方式 作者:爱学习的小王呀 发布时间:2020-11-27 20:05:12 网址:https://blog.csdn.net/hongliwong/article/detail ...
- HIVE的安装配置、mysql的安装、hive创建表、创建分区、修改表等内容、hive beeline使用、HIVE的四种数据导入方式、使用Java代码执行hive的sql命令
1.上传tar包 这里我上传的是apache-hive-1.2.1-bin.tar.gz 2.解压 mkdir -p /home/tuzq/software/hive/ tar -zxvf apach ...
- 计算机图片怎么截图快捷键,电脑截图快捷键四种截屏方式,笔记本电脑如何截屏截图?...
电脑截图快捷键四种截屏方式,笔记本电脑如何截屏截图? 网际百科资讯 知识宝库 2020-3-18 43955 0评论 电脑截图快捷键四种截屏方式,笔记本电脑如何截屏截图?给你推 ...
- windows10系统-10-VirtualBox中的四种网络连接方式
参考快速理解VirtualBox的四种网络连接方式 电脑连接virtualbox虚拟机的方法 VirtualBox NAT 端口映射实现宿主机网络共享 1 VirtualBox四种网络连接 1.1 宿 ...
最新文章
- Vue组件中的data和props属性
- python打开是什么颜色-python图片颜色
- linux下使用expect+scp+shell实现分布式集群系统安装,升级,部署
- 2017年10月08日普及组 蜡烛
- JavaScript this 关键字
- 将远程计算机上的文件夹,如何将现有网站上虚拟目录创建到驻留在远程计算机上的文件夹...
- 关于函数式编程的思考(1)
- fscapture设置中文_Fscapture是什么软件?有没有功能介绍?
- OSGi中的ServletContext
- python计算手机销量年增长率_Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析...
- Oracle 11g R2 软件下载网址收藏
- 磁卡、条码卡、IC卡、ID卡基本知识
- outlook邮箱显示一直启动中_Outlook发送邮件一直停留在发件箱的解决办法
- 为什么amd显卡便宜却买的人少_为什么不推荐人选择AMD?
- hive获取近12个月数据
- js实现正则表达式匹配
- 小程序picker标题_微信小程序实现自定义picker选择器弹窗内容
- 苹果x微信语音十秒就断_原来苹果手机信号差是这个原因!教你4个方法,信号马上满格...
- 二手电商的盛与衰:闲鱼持续扩张,爱回收稳扎稳打,转转战略失焦
- 2018 Mac下pycharm 安装Django及创建app