四、切片 Slice

1 切片

  • 其本身并不是数组,它指向底层的数组
  • 作为变长数组的替代方案,可以关联底层数组的局部或全部
  • 为引用类型
  • 可以直接创建或从底层数组获取生成
  • 使用len()获取元素个数,cap()获取容量
  • 一般使用make()创建
  • 如果多个slice指向相同底层数组,其中一个的值改变会影响全部
  • make([]T, len, cap)
  • 其中cap可以省略,则和len的值相同
  • len表示存数的元素个数,cap表示容量
func main() {
    a:=[10]int{1,2,3,4,5,6,7,8,9}
    fmt.Println(a)
    s1:=a[5:]  //只包含起始索引,不包含尾
    fmt.Println(s1)
}
func main() {
    s1:=make([]int,3,10)
    fmt.Println(len(s1),cap(s1))
    fmt.Println(s1)
}

这里写图片描述

2 Reslice

  • Reslice时索引以被slice的切片为准
  • 索引不可以超过被slice的切片的容量cap()值
  • 索引越界不会导致底层数组的重新分配而是引发错误

2.1 Slice 与底层数组的关系

这里写图片描述


func main() {
    a:=[]byte{'a','b','c','d','e','f','g','h','i','j','k'}
    sa:=a[2:5]
    fmt.Println(len(sa),cap(sa))
    sb:=sa[3:5]
    fmt.Println(string(sb))
}

这里写图片描述

3 Append

  • 可以在slice尾部追加元素
  • 可以将一个slice追加在另一个slice尾部
  • 如果最终长度未超过追加到slice的容量则返回原始slice
  • 如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据
func main() {
    s1 := make([]int, 3, 6)
    fmt.Printf("%p\n",s1)
    s1=append(s1,1,2,3)
    fmt.Printf("%v %p\n",s1,s1)
    s1=append(s1,4,5,6)
    fmt.Printf("%v %p\n",s1,s1)

}

这里写图片描述

func main() {
    a:=[]int{1,2,3,4,5}
    s1:=a[2:5]
    s2:=a[1:3]
    fmt.Println(s1,s2)
    s1[0]=9
    fmt.Println(s1,s2)

}

这里写图片描述

func main() {
    a:=[]int{1,2,3,4,5}
    s1:=a[2:5]
    s2:=a[1:3]
    fmt.Println(s1,s2)
    //当append的元素超过容量,就会指向新的底层数组
    s2=append(s2,6,6,6,6,6,6,6,6,6,6)
    //s1改变,不影响s2
    s1[0]=9
    fmt.Println(s1,s2)

}

这里写图片描述

4 copy

func main() {
    s1:=[]int{1,2,3,4,5,6}
    s2:=[]int{7,8,9}
    copy(s1,s2)
    fmt.Println(s1)

}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u012292754/article/details/80376918