2-18 切片

 

func main() {
    //定义一个10长度的数组
    array := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    
    //切片:定类型不定长度的,切边是可以动态扩张的。
    //从array数组截取切片,含头不含尾,截取到len(array)-1个元素
    slice := array[0:10]

    fmt.Printf("array的类型是%T,array的值是%v\n",array,array)
    fmt.Printf("slice的类型是%T,slice%v\n",slice,slice)

    slice = array[0:5]  //从0项截取到第4项
    fmt.Printf("slice的类型是%T,slice%v\n",slice,slice)

    slice = array[2:5]  //从第二项截取到第4项
    fmt.Printf("slice的类型是%T,slice%v\n",slice,slice)


    slice = array[2:]   //从数组的第二项截取到最后
    fmt.Printf("slice的类型是%T,slice%v\n",slice,slice)

    slice = array[:]    //全部截取数组中的元素
    fmt.Printf("slice的类型是%T,slice%v\n",slice,slice)

  //也可以从切片截取接片。 }

 执行结果

 

兼并另外一个切片

    slice = []int{1, 2, 3}
    slice1 := []int{4, 5, 6}

    for _, vaule := range slice1{
            slice = append(slice, vaule)
        }
        fmt.Println(slice)
    
    //另外一种兼并方法
    slice = append(slice, slice1...)
    fmt.Println(slice)

 

使用make创建切片

    //使用make创建切片,创建一个0长度,0容量的切片。
    slice := make([]int, 0, 0)
    fmt.Printf("slice的值是%d,slice的长度是%d,slice的容量是%d,slice的地址是%p\n", slice, len(slice), cap(slice), &slice)

    //切片的扩容策略,当容量不够时,容量*2(有时会+2),找到一片新的内存,将原有元素拷贝进去。  
    for i := 0; i <= 10; i++ {
        slice = append(slice, i)
        fmt.Printf("slice的值是%d,slice的长度是%d,slice的容量是%d,slice首元素的地址是%p\n", slice, len(slice), cap(slice), &slice[0])

    }

执行结果

 

切片是一种地址引用

    array := [3]int{0,1, 2}
    slice1 := array[:]
    slice2 := array[:]
    fmt.Printf("array的地址是%p,slice1的地址是%p,slice2的地址是%p\n",&array,&slice1,&slice2)  //各不相同,使用的是栈内存,地址不会改变
    fmt.Printf("array[0]的地址是%p,slice1[0]的地址是%p,slice2[0]的地址是%p\n",&array[0],&slice1[0],&slice2[0])
    fmt.Printf("array[1]的地址是%p,slice1[1]的地址是%p,slice2[1]的地址是%p\n",&array,&slice1[1],&slice2[1])

执行结果

修改slice[1],slice[2]

    slice1[1] = 11
    slice2[2] = 22
    fmt.Println(array)
    fmt.Println(slice1)
    fmt.Println(slice2)

 

可以看到数组array的slice的元素也会发生变化。

 

posted @ 2019-06-17 13:56  pad+  阅读(207)  评论(0编辑  收藏  举报