一、切片定义

定义切片

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切片的四种声明定义方式,切片的截取、修改与追加相关推荐

  1. 爆破专栏丨Spring Security系列教程之Spring Security的四种权限控制方式

    原创:一一哥 前言: 在前面的章节中,一一哥 已经给大家介绍了Spring Security的很多功能,在这些众多功能中,我们知道其核心功能其实就是认证+授权. 在前面我们分别基于内存模型.基于默认的 ...

  2. java按钮权限控制_详解Spring Security 中的四种权限控制方式

    Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Se ...

  3. ASP.NET MVC下的四种验证编程方式[续篇]

    ASP.NET MVC下的四种验证编程方式[续篇] 原文:ASP.NET MVC下的四种验证编程方式[续篇] 在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET ...

  4. java 按钮 监听_Button的四种监听方式

    Button按钮设置点击的四种监听方式 注:加粗放大的都是改变的代码 1.使用匿名内部类的形式进行设置 使用匿名内部类的形式,直接将需要设置的onClickListener接口对象初始化,内部的onC ...

  5. python接口自动化(十)--post请求四种传送正文方式(详解)

    简介 post请求我在python接口自动化(八)–发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先了 ...

  6. 单片机的四种烧写方式

    参考:单片机的四种烧写方式 作者:爱学习的小王呀 发布时间:2020-11-27 20:05:12 网址:https://blog.csdn.net/hongliwong/article/detail ...

  7. 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 ...

  8. 计算机图片怎么截图快捷键,电脑截图快捷键四种截屏方式,笔记本电脑如何截屏截图?...

    电脑截图快捷键四种截屏方式,笔记本电脑如何截屏截图? 网际百科资讯    知识宝库    2020-3-18    43955    0评论 电脑截图快捷键四种截屏方式,笔记本电脑如何截屏截图?给你推 ...

  9. windows10系统-10-VirtualBox中的四种网络连接方式

    参考快速理解VirtualBox的四种网络连接方式 电脑连接virtualbox虚拟机的方法 VirtualBox NAT 端口映射实现宿主机网络共享 1 VirtualBox四种网络连接 1.1 宿 ...

最新文章

  1. Vue组件中的data和props属性
  2. python打开是什么颜色-python图片颜色
  3. linux下使用expect+scp+shell实现分布式集群系统安装,升级,部署
  4. 2017年10月08日普及组 蜡烛
  5. JavaScript this 关键字
  6. 将远程计算机上的文件夹,如何将现有网站上虚拟目录创建到驻留在远程计算机上的文件夹...
  7. 关于函数式编程的思考(1)
  8. fscapture设置中文_Fscapture是什么软件?有没有功能介绍?
  9. OSGi中的ServletContext
  10. python计算手机销量年增长率_Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析...
  11. Oracle 11g R2 软件下载网址收藏
  12. 磁卡、条码卡、IC卡、ID卡基本知识
  13. outlook邮箱显示一直启动中_Outlook发送邮件一直停留在发件箱的解决办法
  14. 为什么amd显卡便宜却买的人少_为什么不推荐人选择AMD?
  15. hive获取近12个月数据
  16. js实现正则表达式匹配
  17. 小程序picker标题_微信小程序实现自定义picker选择器弹窗内容
  18. 苹果x微信语音十秒就断_原来苹果手机信号差是这个原因!教你4个方法,信号马上满格...
  19. 二手电商的盛与衰:闲鱼持续扩张,爱回收稳扎稳打,转转战略失焦
  20. 2018 Mac下pycharm 安装Django及创建app

热门文章

  1. Python 四期爬虫第三周优秀作业(上)
  2. python串口通信 - serial
  3. JavaScript Math和Date
  4. [CSP-S模拟测试]:辣鸡(ljh) (暴力)
  5. 基于ECharts图表分析腾讯新闻疫苗接种情况(中国、全球)
  6. 服务器有木马后门如何查找SSH后门
  7. 看看谁更快:Ubuntu 10.04对决Windows 7
  8. Ubuntu安装Flash Player插件
  9. 树莓派Odroid等卡片式电脑上搭建NAS教程系列6-miniDLNA
  10. 【Unity】动态加载音效