当前位置: 首页 > news >正文

Go语言Slice的一道骚题

大家好我是一根甜苦瓜,今天我们来聊一道go语言中slice的面试题,加深一下对slice的理解

题目来自于雨痕大佬的《Go学习笔记》第四版,P43页

func TestDemo(t *testing.T) {slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}s1 := slice[2:5]     s2 := s1[2:6:7]      s2 = append(s2, 100)s2 = append(s2, 200)s1[2] = 20           t.Log(s1)            t.Log(s2)        t.Log(slice)
}

暂停5分钟,大家可以人脑编译一下,看看结果回事什么

时间到,公布答案

=== RUN   TestDemouser_repo_test.go:21: [2 3 20]user_repo_test.go:22: [4 5 6 7 100 200]user_repo_test.go:23: [0 1 2 3 20 5 6 7 100 9]
--- PASS: TestDemo (0.00s)
PASS

是不是脑瓜子嗡嗡的呀?下面来图解这道题

先来看初始化 slices1s2 这三行代码:
在这里插入图片描述
● 第 22 行将 slice 初始化为一个数组,元素是 0-9 这没有什么好说的。
● 第 23 行,是在 slice 的基础上创建的 s1,选择下标范围 [2,5) 的元素来创建。左闭右开。容量为 3,cap 为 8
● 第 24 行,s2s1 的基础上创建,下标范围是 s1[2,6)cap 容量到了 7 号下标,容量为 4cap5
所以最终的三个对象的内存布局如下图:
在这里插入图片描述
接下来看代码s2 = append(s2, 100),由于 s2cap5,此时尚有一个空间可以插入,所以直接 append。但是由于共用了底层数组 s1slice,所以最终,他们三个变量都会被影响,最终结果如下:
在这里插入图片描述
接下来看代码s2 = append(s2, 200),此时 s2lencap 都为 5,那么在s2上继续添加元素显然不够用了,需要扩容,扩容是新开辟了空间,将老数据复制过去,所以s2和老数组并无瓜葛了。这里是直接翻倍扩容(关于扩容大家可以去百度一下)。至此三个变量的内容如下。
在这里插入图片描述
最后再看这行代码 s1[2] = 20
这个就很简单了,此时 s1 还是和老数组有瓜葛的,所以一改全改但是不会影响到新开辟的 s2。最终三个数组/切片的情况就是下面这个图。

在这里插入图片描述
这里需要注意的是,由于打印 S1 的时候并不会把 len 以外的数据打印出来,所以最终输出结果是:
在这里插入图片描述

http://www.dtcms.com/a/479996.html

相关文章:

  • 做网站如何语音泉州哪个公司网站做的好
  • 校园电商平台网站建设自己怎么个人网站
  • 宣城网站seo诊断河北新增9个中风险地区
  • 懒人手机网站模板电子商务开发公司
  • 什么是偏自相关函数PACF
  • 网站建设费应计入什么科目手机礼品网站模板
  • 潍坊快速网站排名上海外贸财经大学
  • 杭州网站设计开发做网站软件是什么下载
  • 模板网站建设公司wordpress 干净主题
  • JavaSPI机制
  • 网站seo文章该怎么写长春网站建设方案推广
  • 制作网站需要哪些技术遵义发布
  • devexpress网站开发企业网站模板科技感
  • 淄博便宜网站设工程建设标准化
  • 免费网站怎么建立可以做配音兼职的网站
  • 企业网站seo推广技巧点餐系统微信小程序
  • 黑科技软件合集网站element ui做门户网站
  • 网站后台文本编辑器新泰网站制作
  • 31. Unity游戏对象的渲染顺序
  • 网站外包价格 北京网站制作公司网页制作模板ppt制作
  • dede网站站内推广方法扬州广陵城乡建设局网站
  • 广州做蛋糕的网站WordPress获取标签名字
  • 个人网站备案 费用wordpress 图片排版
  • sns网站社区需求分析文档佛山人才招聘网
  • 网站须知wordpress导航菜单代码
  • 网站负责人备案采集照具体要求南昌个人做网站
  • 云南省科技网站无锡哪家做网站好
  • 短视频网站怎么建设做网站只有域名
  • 一个虚拟主机绑定2个网站大学做视频网站
  • 石油工程建设协会网站网站域名哪看