美文网首页
Golang学习笔记6——slice

Golang学习笔记6——slice

作者: MarksGui | 来源:发表于2017-10-22 20:38 被阅读14次

    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

          本文链接:https://www.haomeiwen.com/subject/hmrnuxtx.html