Golang学习笔记6——slice

1.slice 概述

  • 其本身并不是动态数组或数组指针,它内部通过指针引用底层数组
  • 作为变长数组的替代方案,可以关联底层数组的局部或全部
  • 是引用类型
  • 可以直接创建或从底层数组获取生成
  • 使用len()获取元素个数,cap()获取容量

2.创建 slice

  • 使用make()创建或使用切片字面量
//使用:make([]T, len, cap)
//len便是存数的元素个数,cap表示容量

s1 := make([]int, 3, 6) //指定len、cap,底层数组初始化为零值
s2 := make([]int, 3)    //省略cap,和len相等
s3 :=[]int{1, 2, 5:3}   //按初始化元素分配底层数组,并设置len、cap

  • nil切片和空切片
var s1 []int          //nil切片
s2 := make([]int, 0)  //空切片
s3 := []int{}         //空切片
不管是nil切片还是空切片,可以对其调用内置函数appen、len、cap

  • 如果多个slice指向相同底层数组,其中一个的值改变会影响全部
func main() {
    a := []int{0,1,2,3,4,5,6,7,8}
    s1 := a[1:4]
    s2 := a[3:5]
    s1[2] = 10
    fmt.Println(a)
    fmt.Println(s1)
    fmt.Println(s2)
}

3.reslice 概述(slice的切片操作)

  • Reslice时索引以被slice的切片为准
  • 索引不可以超过被slice的切片的容量cap()值
  • 索引越界不会导致底层数组的重新分配而是引发错误
  • 新建的切片对象仍然指向原底层数组
s1 := []int{1,2,3,4,5}
s2 := s1[1:]            //reslice操作

4.append()与slice

  • append可以在slice尾部追加元素
  • append可以将一个slice追加到另一个slice尾部
  • 如果最终长度未超过追加到slice的容量则返回原始slice
  • 如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据
s1 := []int{0, 1}
s2 := append(s1, 2)

5.copy()与slice

//此处表示a拷贝进b里面,所以b变为1,2,3
func main() {
    a := []int{1,2,3,4}
    b := []int{5,6,7}
    copy(b, a)
    fmt.Println(a, b)
}
//把a的第一个元素,拷贝到b的第二个元素上
func main() {
    a := []int{1,2,3,4}
    b := []int{5,6,7}
    copy(b[1:2], a[0:1])
    fmt.Println(a, b)
}

你可能感兴趣的:(Golang学习笔记6——slice)