【golang】数组和切片
在golang中,有一个“罕见”的复合类型,叫切片,切片是基于数组的,golang和其它语言不一样,在golang中,数组是不可变的,对数组进行类型转换等操作都会导致golang隐式的申请一块内存,然后将原数组的内容复制到这块内存。
数组是不可变的,这就决定了字符串也是不可变的,因为字符串底层就是一个byte数组实现的。
在实际的开发当中,我们经常使用的是切片,而不是数组。
切片
切片是基于数组的,它表示一个拥有相同类型元素的可变长度的序列
切片是一种轻量级的数据结构,可以用来访问数组的部分或者全部的元素,emmmmm,可以把它看作一个指向数组的某块区域的引用,这块区域可以是数组的部分,也可以是数组的全部。
切片包含长度,容量,指针三个属性,指针指向的是数组的某块区域,容量一般是数组的长度,而长度指的是切片开始的位置到切片结束的位置的长度,而容量是指切片开始的位置到数组结束的位置,看得出来,切片是依赖于数组的
假设现在有这样一个整型数组
arr := [...]int{
1,2,3,4,5}
现在创建一个基于该数组的切片
slice := arr[0:3]
现在的slice的指针指向的就是arr的第一个元素,而它的长度是3,容量是整个数组的长度5
现在来看一下切片的实际应用
比如有时候我们想要频繁的修改一个数组的元素,那么我们从一开始就可以创建一个切片
比如创建一个1, 2, 3, 4, 5的整型的切片
slice := []int{
1,2,3,4,5}
slice[1] = 0
fmt.Println(slice) //1 0 3 4 5
这段切片的声明只比上面的数组声明少