目录
1.切片
1.定义
Go 语言切片是对数组的抽象。
Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
所以我们就明白了为什么要是使用切片,因为数组的局限性。
slice有三种属性:指针,长度,容量。
type slice struct {
array unsafe.Pointer//指针
len int//长度
cap int//容量
}
slice的三种申明方式
package main
import "fmt"
func main() {
//1、make
a := make([]int32, 0, 5)
//2、[]int32{}
b := []int32{1, 2, 3}
//3、new([]int32)
c := *new([]int32)
fmt.Println(a, b, c)
}
slice指针数组的第一个可以从slice中访问的元素,这个元素并不是第一个元素。
长度是指slice中的元素个数,它不能超过slice的容量。
容量的大小通常是从slice的起始元素到底层数组的最后一个元素间元素的个数。
可以通过内置函数len和cap用于返回slice的长度和容量
months := [...]string{1:"January",/*...*/,12:"December"}
//数组的定义
一个数组可以对用多个slice,这些slice可以引用数组的任何位置,也可以有重复
2.操作
可以通过以下方式来进行创建一个新的slice,这个slice引用到了从i到就j - 1索引位置的所有元素,这里的s既可以是数组,或者指向数组的指针,也可以是slice。
s[i:j]//slice的操作符,(0 <= i <= j <= cap(s))
新的slice的长度是j - i个
如果忽略前面的i,那么就是从0开始,如果忽略j,那么就是一直到len(s) - 1,但是如果是超过的话,就是无效引用。
所以我们自己也可以创建一个切片
arr := make([]int, 2, 54)
arr[0], arr[1] = 3, 6
brr := arr
brr[0] = 4
我们可以看出来使用make进行切片的一个申明,后面的cap可有可无,但是当有的时候是要大于等于长度的,让后通过一个赋值语句进行赋值,我们在复制的时候 不能越界,在把arr底层拷贝给brr,然后再利用brr进行修改,这时候我们发现切片是地址引用,我们通过改变brr进而可以改变arr。
我们的容量为什么比较大呢,我们可以通过append进行扩容
可以看出对arr进行扩容,然后返回给brr,这个时候arr只有原来的数,brr里面却是增加了的,如果超出之前的容量的话,那么就会扩容,重新申请一个空间,这个时候这个返回的就是指向一个新的内内存空间
这个是切片的遍历,我们可以通过for-range进行循环,这个底层机制是先将arr里面的取出来存到ele里面,然后一下下一直到后面的,i是索引,ele是里面的值
当我们打印地址之后,会发现,ele的地址是不变的,只有arr的地址会变化
2.总结
我们通过对切片的再次了解,会发现很多深层次的东西,这些会帮助我们有更好的作用