企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[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)