slice切片

Go 语言切片是对数组的抽象。

Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

切片本身并不是动态数组或者数组指针。它内部实现的数据结构通过指针引用底层数组,设定相关属性将数据读写操作限定在指定的区域内。切片本身是一个只读对象,其工作机制类似数组指针的一种封装。

切片(slice)是对数组一个连续片段的引用,所以切片是一个引用类型(因此更类似于 C/C++ 中的数组类型,或者 Python 中的 list 类型)。这个片段可以是整个数组,或者是由起始和终止索引标识的一些项的子集。需要注意的是,终止索引标识的项不包括在切片内。切片提供了一个与指向数组的动态窗口。

给定项的切片索引可能比相关数组的相同元素的索引小。和数组不同的是,切片的长度可以在运行时修改,最小为 0 最大为相关数组的长度:切片是一个长度可变的数组。


切片的结构体由3部分构成,Pointer 是指向一个数组的指针len 代表当前切片的长度cap 是当前切片的容量。cap 总是大于等于 len 的。

如果想从 slice 中得到一块内存地址,可以这样做:

    s:=make([]byte,200)

    ptr:=unsafe.Pointer(&s[0])

如果反过来呢?从 Go 的内存地址中构造一个 slice。

    varptr unsafe.Pointer

    vars1=struct{

        addr uintptr

        len int

        cap int

    }{ptr,length,length}

    s := *(*[]byte)(unsafe.Pointer(&s1))

构造一个虚拟的结构体,把 slice 的数据结构拼出来。

当然还有更加直接的方法,在 Go 的反射中就存在一个与之对应的数据结构 SliceHeader,我们可以用它来构造一个 slice

    var o []byte

    sliceHeader := (*reflect.SliceHeader)((unsafe.Pointer(&o)))

    sliceHeader.Cap=length

    sliceHeader.Len=length

    sliceHeader.Data=uintptr(ptr)

1、定义切片

(1)声明一个未指定大小的数组来定义切片:var identifier []type  需要注意的是 [ ] 里面不要写数组的容量,因为如果写了个数以后就是数组了,而不是切片了

(2)使用make()函数来创建切片:var slice1 []type = make([]type, len)

                                                        slice1 := make([]type, len)

                                                        make([]T, length, capacity)


2、切片的初始化

s :=[] int {1,2,3 }  直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3

s := arr[:]     初始化切片s,是数组arr的引用

s := arr[startIndex:endIndex]     将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片

s := arr[startIndex:]     缺省endIndex时将表示一直到arr的最后一个元素

s := arr[:endIndex]     缺省startIndex时将表示从arr的第一个元素开始

s1 := s[startIndex:endIndex]     通过切片s初始化切片s1

s :=make([]int,len,cap)     通过内置函数make()初始化切片s,[]int 标识为其元素类型为int的切片

3、内置函数

len() 函数:切片是可索引的,并且可以由 len() 方法获取长度。

cap() 函数:切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。

append()函数:如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。

copy() 函数:值拷贝。

4、底层实现

https://blog.csdn.net/m0_37579159/article/details/79344056(感觉这篇作者写得很好)

你可能感兴趣的:(slice切片)