Loading

slice切片切割成数组,数组指针指向原slice的位置

切片理解

切片的本质就是对底层数组的封装,它包含了三个信息:底层数组的指针、切片的长度(len)和切片的容量(cap)。

 举个例子,现在有一个数组a := [8]int{0, 1, 2, 3, 4, 5, 6, 7},切片s1 := a[:5],相应示意图如下。

 

 

 切片s2 := a[3:6],相应示意图如下:

 

 

 代码验证数组的指针:

package main

import "fmt"

func main() {
    sl := make([]int, 6)
    fmt.Printf("%p\n", &sl) //地址用%p

    //slice 切割成数组,数组的指针地址指向切割的第一个元素
    a := [5]int{1, 2, 3, 4, 5}
    fmt.Printf("p:%p\n", &a[1]) //p:0x1400011a068
    s := a[1:5]                 //p:0x1400011a068
    fmt.Printf("s:%v,p:%p,len(s):%v,cap(s):%v\n", s, s, len(s), cap(s))

    //多次切割还是指向原来slice的切割位置的元素地址
    fmt.Printf("p:%p\n", &a[4]) //p:0x1400011a080
    s2 := s[3:4]                //p:0x1400011a080
    fmt.Printf("p:%p\n", s2)

    //切割的数组是slice的引用,修改数组会修改原slice数据
    s2[0] = 66
    fmt.Println(a, s, s2) //[1 2 3 4 66] [2 3 4 66] [66]
}

 

posted @ 2023-02-23 10:35  江小园  阅读(52)  评论(0编辑  收藏  举报