go 切片报错 panic:runtime error:index out of range [0] with length 0

问题来源:如下图所示,我声明了一个切片,它提示我下标越界。
在这里插入图片描述
那我们来debug一下为什么会这样
在这里插入图片描述
可以看到这种声明方式的切片中存储的并不是零值,而是nil
其实只要换成var ss = make([]int,n)就行了
接下来看一下原理,深度解析go语言切片的三种特殊状态 零切片,空切片和nil切片
切片的底层是一个数组,切片的表层是一个包含三个变量的结构体,当我们将一个切片赋值给另一个切片时,本质上是对切片表层结构体的浅拷贝。结构体中第一个变量是一个指针,指向底层的数组,另外两个变量分别是切片的长度和容量。
在这里插入图片描述
先来看最简单的零切片
在这里插入图片描述
接着是空切片和nil切片
在这里插入图片描述
上面这四种形式从输出结果上来看,似乎一摸一样,没区别。但是实际上是有区别的,我们要讲的两种特殊类型「空切片」和「 nil 切片」,就隐藏在上面的四种形式之中。 我们如何来分析三面四种形式的内部结构的区别呢?接下里要使用到 Go 语言的高级内容,通过 unsafe.Pointer 来转换 Go 语言的任意变量类型。 因为切片的内部结构是一个结构体,包含三个机器字大小的整型变量,其中第一个变量是一个指针变量,指针变量里面存储的也是一个整型值,只不过这个值是另一个变量的内存地址。我们可以将这个结构体看成长度为 3 的整型数组 [3]int。然后将切片变量转换成 [3]int。
在这里插入图片描述
从输出中我们看到了明显的神奇的让人感到意外的难以理解的不一样的结果。 其中输出为 [0 0 0] 的 s1 和 s4 变量就是「 nil 切片」,s2 和 s3 变量就是「空切片」。824634199592 这个值是一个特殊的内存地址,所有类型的「空切片」都共享这一个内存地址。
在这里插入图片描述
在这里插入图片描述
最后一个问题是:「 nil 切片」和 「空切片」在使用上有什么区别么?官方推荐nil切片,来看原因
在这里插入图片描述
「空切片」和「 nil 切片」有时候会隐藏在结构体中,这时候它们的区别就被太多的人忽略了,下面我们看个例子
在这里插入图片描述
可以发现这两种创建结构体的结果是不一样的! 「空切片」和「 nil 切片」还有一个极为不同的地方在于 JSON 序列化,这点极其重要!
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值