golang切片的一些case,你遇见过吗?|周末学习

本文已参与周末学习计划,点击链接查看详情:juejin.cn/post/6965720248234442782

切片也算是golang的一个特色类型, 本文想分享一些实践的时候遇到的一些有意思的情况。

  • 第一个。下面的代码会输出什么呢?
slice := []int{10, 20, 30, 40, 50}
newSlice := slice[1:3]
newSlice = append(newSlice, 60)
fmt.Println(slice, newSlice)
复制代码

要不要先猜一下试试~

答案是(10,20,30,60,50)(20,30,60)。因为切片引用了底层数组,修改切片的时候修改的是底层数组。

问号时间到!看到这里大家会不会有几个问题,比如:底层数组是什么意思?为什么会修改底层数组?任何情况下修改切片都会修改到底层数组吗?切片一旦被声明,对应的底层数组一直都会是同一个吗?如果不是,那么什么时候会使切片对应另外一个底层数组呢?还有最重要的一个问题,怎么避免错误地修改了底层数组的这个问题?

我这里先回答最后一个问题。可以将newSlice的声明修改为下面的样子:

newSlice := slice[1:3:3]
复制代码

slice[1:3]获得的切片newSlice的容量是5-1=4,slice[1:3:3]中的第三个参数决定了newSlice的容量是2,在newSlice append新元素的时候如果newSlice的容量不够了会扩容拥有一个全新的底层数组,因此不会修改slice的原底层数组。

问号时间又来啦!为什么slice[1:3]的容量是4呢?为什么slice[1:3:3]的容量是2呢?欢迎大家在评论区讨论✪υ✪

  • 第二个。下面的代码两处都会输出什么呢?
x := []int{1,2,3}
Func(arr []int){
    arr[0] = 7
    arr = append(arr, 100)
    arr = append(arr, 101)
    fmt.Println(arr)
}(x)
fmt.Println(x)
复制代码

如果问题一大家都已经知道答案了,那问题二就会比较容易,不要想的太复杂咯。答案是:[7 2 3 100 101] [7 2 3]

它是指针类型,但是使用的时候不需要初始化;对于开发者来说,切片的扩展和遍历的使用都很方便,但是有时候删除一个元素的时候,会出现一些意想不到的情况;还有一些情况,比如说,明明没有修改某个切片,但是切片的内容就变化了… 遇到的状况不一而足,遇到问题的是可能会满头小问号,比如像第一题,不过这也是好事情,有问题才会有进步。今天分享的两个例子从根本上来说,就是涉及到了切片的底层数组、容量、长度这三个点,这期提供了好多小问号,更多内容请见下期噢~ ❤️

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享