go语言切片Slice和数组Array对比panic runtime error index out of range问题解决_array index out of range

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

"reflect"

)

func main() {
//字面创造Slice
sliceOne := []string{“a”, “b”}
//使用make函数创造slice
sliceTwo := make([]string, 10)
sliceThree := make([]int, 10)

fmt.Printf("使用字面量创建的slice%s\n",reflect.ValueOf(sliceOne).String())
fmt.Printf("使用make函数创建的slice:%s\n",reflect.ValueOf(sliceTwo).String())
fmt.Printf("使用make函数创建的slice:%s\n",reflect.ValueOf(sliceThree).String())

}


程序输出:



使用字面量创建的slice<[]string Value>
使用make函数创建的slice:<[]string Value>
使用make函数创建的slice:<[]int Value>

Process finished with the exit code 0


### 2、slice的长度和容量概念理解


学习过程中,很多小伙伴会对slice的长度和容量问题有着很多混淆。


这个地方可以把切片比喻成一个可以装10个苹果的袋子,现在的袋子里面有三颗苹果。切片的长度就是袋子已经装的果子的个数,目前是3个。切片的容量就是这个袋子一共能装多少个果子,对于这个袋子来说就是10。那么把代码替换成切片,把苹果替换成元素,是不是就懂了撒~


下面就是该问题的处理办法就是直接去官方,看源码。看看第一手资料怎么讲!


![](https://img-blog.csdnimg.cn/b3bb2aec5dbd46d98ca01f55deee5f13.png)


 



> 
> 
> ```
> 长度:slice中拥有的元素个数,如果slice是nil的话,则元素个数长度是0
> 英文:the number of elements in v; if v is nil, len(v) is zero
> 
> ```
> 
> 



> 
> 
> ```
> 容量:slice切片的长度能够到达的最大值
> 英文:Slice: the maximum length the slice can reach when resliced;
> ```
> 
> 


代码验证环节:



package main

import (
“fmt”
)

func main() {
sliceOne := []string{“a”, “b”}
strings := sliceOne[0:1]
fmt.Printf(“切片的长度:%d\n”,len(strings))
fmt.Printf(“切片的容量:%d\n”,cap(strings))
}


代码结果输出:



切片的长度:1
切片的容量:2


代码原理解析:


strings由sliceOne切片而来,切出来的片上数据有的是0到1,有一个元素,故其对应的长度是1。


因为切片是一个引用类型,只在原始切片上切出了0到1的位置,剩余的空位还有1,故其容量等于长度加剩余元素位置数。


### 3. 切片扩容及slice panic: runtime error: index out of range


slice越界代码实例如下:



sliceOne := []string{"a", "b"}
//使用make函数创造slice
s := sliceOne[2]
fmt.Printf(s)

使用sliceOne[2]语句时,数组越界报错。


实际开发过程中,总会有slice容量不够用的时候,该怎么扩容,如何保证安全扩容?


**go语言官方提供的扩容办法就是创建一个新的更大的分片,将老分片的数据内容迁移到新的切片当中。**


**代码展示:**



package main

import (
“fmt”
)

func main() {
sliceOne := []string{“a”, “b”}
fmt.Printf(“切片扩容前”)
fmt.Printf(“切片的长度:%d\n”,len(sliceOne))
fmt.Printf(“切片的容量:%d\n”,cap(sliceOne))
t := make([]string, len(sliceOne), (cap(sliceOne))*2)
copy(t, sliceOne)
sliceOne = t
fmt.Printf(“切片扩容后”)
fmt.Printf(“切片的长度:%d\n”,len(sliceOne))
fmt.Printf(“切片的容量:%d\n”,cap(sliceOne))
}


**结果展示:**



切片的长度:2
切片的容量:2
切片的长度:2
切片的容量:4



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
![img](https://img-blog.csdnimg.cn/img_convert/ed64b7a356ee0abda8acec3690a89ed9.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**



**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
[外链图片转存中...(img-HzF6NtB8-1713287874664)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值