[TOC]
>[success] ## **1:基本介绍**
1)切片的英文是slice
2)切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制。
3)切片的使用和数组类似,遍历切片、访问切片的元素和求切片长度len(slice)都一样
4)切片的长度是可以变化的,因此切片是一个可以动态变化数组。
5)切片定义的基本语法:
var变量名[ ]类型
比如: var[ ] int
>[success] ## **2:入门案例**
![](https://img.kancloud.cn/67/a3/67a3ab13800017c7ee3a6dd15a3f6f14_1280x349.png)
>[success] ## **3:切片在内存中的形式**
![](https://img.kancloud.cn/dd/66/dd665893bebae5f257e6a65d9b0a27d5_1280x535.png)
>[success] ## **4:切片的使用**
1. 方式1,上面写过
2. 方式2:通过make来创建切片,
基本语法:var 切片名 []type = make([ ]type,len,[cap])
参数说明:type就是数据类型,len:大小,cap:指定切片 **容量**可选
案例演练:
![](https://img.kancloud.cn/39/68/3968541a3e7da98286b5ca88502a4dde_1280x517.png)
3. 定义一个切片,直接就指定具体数组,使用原理类似make的方式。
![](https://img.kancloud.cn/11/21/1121e0cc3fa842991def2a673c73a236_1280x402.png)
>[success] ## **5:切片的遍历**
如下两种遍历方式:
![](https://img.kancloud.cn/7b/e7/7be7823d17cd1ba352e72f1f9fd5cd0c_1280x683.png)
![](https://img.kancloud.cn/6c/83/6c83c70353499a50b2e512bf3d208aed_1280x566.png)
>[success] ## **6:切片注意事项与细节**
1)切片初始化时var slice = arr[startIndex:endIndex]
说明:从arr数组 下标为startIndex,取到下标为endIndex的元素(不含arr[endIndex])。
2)切片初始化时,仍然不能越界。范围在[0-len(arr)] 之间,但是可以动态增长.
(2.1)var slice = arr[0:end]可以简写var slice = arr[:end]
![](https://img.kancloud.cn/3a/85/3a859539f988e742d45c30e6286238cb_1280x438.png)
(2.2) var slice = arr[start:len(arr)]可以简写: var slice = arr[start:]
![](https://img.kancloud.cn/cb/c4/cbc403660b3a6661c5e32a00e81e6868_1280x312.png)
(2.3) var slice = arr[0:len(arr)]可以简写: var slice = arr[:]
![](https://img.kancloud.cn/8c/39/8c39c6737e6939455f8fab2f7faee05b_1280x320.png)
3)cap是一个内置函数,用于统计切片的容量,即最大可以存放多少个元素。
4)**切片定义完后,还不能使用,因为本身是一个空的,需要让其引用到一个数组或者make-一个空间供切片来使用**
<br>
<br>
5)切片可以继续切片
![](https://img.kancloud.cn/40/e9/40e9fc31d0cd1afabe0ff4f769a0928e_1280x474.png)
6)如果切片改变了数组的元素(值)那么整个数组会发生变化,案例如下
因为切片指向的空间和数组本身的空间是一个地址,所以发生了变化
![](https://img.kancloud.cn/19/ba/19ba6621fc7976a6929a940c0cb32c73_1280x517.png)
>[success] ## **7 : append函数**
1)动态追加元素,一个或多个
![](https://img.kancloud.cn/b9/20/b920165668f6ffe228b1b8c5aa247d3f_1280x421.png)
**切片append操作的底层原理分析:**
2)切片append操作的本质就是对数组扩容
3)go底层会创建一下新的数组newArr(安装扩容后大小
4)将slice原来包含的元素拷贝到新的数组newArr
5)slice重新引用到newArr
6)注意newArr是在底层来维护的,程序员不可见.
7)案例演示说明
>[success] ## **8:copy操作**
**切片的拷贝操作**
**注意:只有切片类型才有拷贝**
![](https://img.kancloud.cn/da/22/da225f4ba621cb221298dbbb6f0c2ad3_1280x615.png)
**对上面代码说明:**
1)copy(para1, para2)参数的数据类型是切片
2)按照上面的代码来看,arr和slice的数据空间是独立,,相互不影响,也就是说arr[0]= 999,slice[0]仍然是1
**拷贝细节**
下面代码会报错吗?可以编译通过吗?为什么?
![](https://img.kancloud.cn/47/7a/477aaf0fecb10d364f2431d44c0af8e3_1280x465.png)
答:可以编译成功不会报错 ,因为如果切片的容量不够切不会继续往下切,只会切有容量可以装下的元素
![](https://img.kancloud.cn/da/ab/daab812c72715fb023df45f779835cfb_1280x179.png)
>[success] ## **9:string和slice**
1)string底层是一个byte数组,因此string也可以进行切片处理 ----案例演示:
![](https://img.kancloud.cn/21/bc/21bc9a7a064b7017ce458df626067c0e_1280x400.png)
2)string是不可变的,也就说不能通过str[0]= 'z'方式来修改字符串(会报错)
3)如果需要修改字符串可以先将string -> []byte(切片) 或者[ ]rune(切片) ->修改->重写转成string
![](https://img.kancloud.cn/15/61/1561990425cdd90e77d4e298c4cd15e2_1280x367.png)
注意:转换成[]byte后, 可以出来英文,和数字,但是不能处理中文
因为,[ ]byte字节来处理,而一个汉字,是3个字符,因此将会出现乱码
**解决方法是:string转成[ ]rune,因为[ ]rune是按照字符处理,兼容汉字**
![](https://img.kancloud.cn/e8/e9/e8e91c3c66a671efafa695d890595902_1280x419.png)
- Golang语言之旅
- 第一章:初始小节以及安装
- 一:Golang语言特性
- 二:Windows上安装Go语言开发包
- 三:在Mac OS上安装Go语言开发包
- 第二章:GO语言注意事项
- 一:Dos的常用指令
- 第三章:Go初识小菜
- 一:Go语言之变量与常量
- 二:Go内置值-引用类型
- 三:基本的数据类型
- 四:字符串(char)
- 五:布尔类型(bool)
- 六:字符串类型(string)
- 七:基本数据类型的默认值
- 八:基本数据类型的互相转换
- 九:基本数据类型和string类型的相互转换
- 十:Golang指针
- 十一:值类型和引用类型
- 十二:标识符和命名规范
- 十三:系统保留关键字and预定义标识符
- 十四:fmt常用方法解析
- 第四章:Go运算符
- 一:运算符的基本介绍
- 二:算术运算符
- 2.1:算数运算符细节
- 三:关系运算符
- 3.1:关系运算符细节
- 四:逻辑运算符
- 4.1:逻辑运算符细节及案例
- 五:Go赋值运算符
- 5.1:案例演示赋值运算符的基本使用
- 5.2:赋值运算符的特点
- 六:Go位运算符
- 七:其他运算符
- 八:运算符的优先级
- 九:控制台输入语句
- 十:进制
- 十一:位运算
- 第五章:流程控制大纲
- 一:if语句
- 二:switch语句
- 三:for循环
- 第六章:函数-包-错误处理
- 一:Go函数
- 二:Go包
- 三:匿名函数
- 四:闭包
- 五:函数defer
- 六:函数参数的传递方式
- 七:变量的作用域
- 八:时间和日期相关函数
- 九:new和recover异常
- 十:数组(Array)切片(Section)
- 十一:切片(slice)
- 十二:3 数组的排序和查找
- 第七章:Map
- 第一节:Map基础认识
- 第二节:Map初始化和make
- 第三节:Map增删改查
- 第四节:Map的切片
- 第五节:Map的注意事项
- 第八章:面向对象(上)
- 第一节:结构体(值类型)
- 第二节:方法
- 第三节:面向对象编程应用实例
- 第九章:面向对象(下)
- 第一节:面向对象之抽象
- 第二节:面向对象之继承
- 第三节:面向对象之多态
- 第四节:接口
- 第十章:文件操作
- 第一节:文件基本介绍
- 第二季:写文件实例操作
- 第三节:JSON
- 第十一章:单元测试
- 第一节:单元测试介绍
- 第二节:单元测试案例
- 第三节:单元测试总结
- 第四节:单元测试案例
- 第十二章:goroutine和channel
- 第一节:goroutine基本介绍
- 第二节:goroutine入门案例
- 第三节:goroutione调度模型
- 第四节:Golang设置运行的CPU数量
- 第十二章:channel
- 第一节:channel基本介绍
- 第二节:channel基本使用
- 第三节:channel案例演示
- 第四节:channel 使用的注意事项
- 第五节:channel练习题
- 第六节:channel的遍历和关闭
- 第七节:goroutione和channel结合
- 第八节:channel细节处理
- 第十二章:并发模式
- 第十三章:反射reflect
- 第一节:反射基本介绍
- 第二节:反射重要的函数和概念
- 第三节:反射快速入门案例
- 第四节:反射注意事项
- 第五节:反射练习题
- 第六节:反射最佳实践