切片
- 切片的引入 切片(slice)是golang中一种特有的数据类型
- 数组有特定的用处,但是却有一些呆板(数组长度固定不可变),所以在 Go 语言的代码里并不是特别常见。
- 相对的切片却是随处可见的,切片是一种建立在数组类型之上的抽象,它构建在数组之上并且提供更强大的能力和便捷。
- 切片(slice)是对数组一个连续片段的引用,所以切片是一个引用类型。这个片段可以是整个数组,或者是由起始和终止索引标识的一些项的子集。需要注意的是,终止索引标识的项不包括在切片内。
- 切片提供了一个相关数组的动态窗口。
- 切片的语法:
var 切片名 []类型 = 数组的一个片段引用
切片的定义
- 方式1:定义一个切片,然后让切片去引用一个已经创建好的数组,slice1 := intarr[1 : 3]。intarr是定义好的数组
- 方式2:通过make内置函数来创建切片。基本语法: var 切片名 []type = make([]type, len,[cap]) make底层创建一个数组,对外不可见,所以不可以直接操作这个数组。要通过slice去间接的访问各个元素,不可以直接对数组进行维护/操作。如slice2 := make([]int , 4, 20)
- 方式3:定一个切片,直接就指定具体数组,使用原理类似make的方式。如slice3 := []int{1, 4, 7}
- 可知切片这部分跟python基本一致
切片注意事项
- 切片定义后不可以直接使用,需要让其引用到一个数组,或者make一个空间供切片来使用
- 切片使用不能越界
- 简写方式:
var slice = arr[0:end] ----> var slice = arr[:end]
var slice = arr[start:len(arr)] ----> var slice = arr[start:]
var slice = arr[0:len(arr)] ----> var slice = arr[:]
-
切片可以继续切片
-
切片可以动态增长
- 底层原理:
- 1.底层追加元素的时候对数组进行扩容,老数组扩容为新数组:
- 2.创建一个新数组,将老数组中的所有元素复制到新数组中,在新数组中追加想要追加的元素
- 3.用append(slice,元素,元素,...)追加的新切片,底层数组的指向 指向的是新数组
- 4.往往我们在使用追加的时候其实想要做的效果给slice追加
- 5.底层的新数组 不能直接维护,需要通过切片间接维护操作。
-
切片的拷贝:先定义好a,b切片,然后copy(b,a) ,将a中对应数组中元素内容复制到b中对应的数组中