Go里面的切片

目录

1.切片

1.定义

2.操作

          2.总结


1.切片

1.定义

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

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

所以我们就明白了为什么要是使用切片,因为数组的局限性。

slice有三种属性:指针,长度,容量。

type slice struct {
    array unsafe.Pointer//指针
    len   int//长度
    cap   int//容量
}

slice的三种申明方式

package main
import "fmt"
func main() {
    //1、make
    a := make([]int32, 0, 5)
    //2、[]int32{}
    b := []int32{1, 2, 3}
    //3、new([]int32)
    c := *new([]int32)
    fmt.Println(a, b, c)
}
​

slice指针数组的第一个可以从slice中访问的元素,这个元素并不是第一个元素。

长度是指slice中的元素个数,它不能超过slice的容量。

容量的大小通常是从slice的起始元素到底层数组的最后一个元素间元素的个数。

可以通过内置函数len和cap用于返回slice的长度和容量

months := [...]string{1:"January",/*...*/,12:"December"}
//数组的定义

一个数组可以对用多个slice,这些slice可以引用数组的任何位置,也可以有重复

img

2.操作

可以通过以下方式来进行创建一个新的slice,这个slice引用到了从i到就j - 1索引位置的所有元素,这里的s既可以是数组,或者指向数组的指针,也可以是slice。

s[i:j]//slice的操作符,(0 <= i <= j <= cap(s))

新的slice的长度是j - i个

如果忽略前面的i,那么就是从0开始,如果忽略j,那么就是一直到len(s) - 1,但是如果是超过的话,就是无效引用。

所以我们自己也可以创建一个切片

    arr := make([]int, 2, 54)
    arr[0], arr[1] = 3, 6
    brr := arr
    brr[0] = 4

我们可以看出来使用make进行切片的一个申明,后面的cap可有可无,但是当有的时候是要大于等于长度的,让后通过一个赋值语句进行赋值,我们在复制的时候 不能越界,在把arr底层拷贝给brr,然后再利用brr进行修改,这时候我们发现切片是地址引用,我们通过改变brr进而可以改变arr。

我们的容量为什么比较大呢,我们可以通过append进行扩容

可以看出对arr进行扩容,然后返回给brr,这个时候arr只有原来的数,brr里面却是增加了的,如果超出之前的容量的话,那么就会扩容,重新申请一个空间,这个时候这个返回的就是指向一个新的内内存空间

这个是切片的遍历,我们可以通过for-range进行循环,这个底层机制是先将arr里面的取出来存到ele里面,然后一下下一直到后面的,i是索引,ele是里面的值

当我们打印地址之后,会发现,ele的地址是不变的,只有arr的地址会变化

2.总结

我们通过对切片的再次了解,会发现很多深层次的东西,这些会帮助我们有更好的作用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值