当前位置:首页 > 科技  > 软件

Go 面试中的隐藏陷阱:SliceHeader 问题解析

来源: 责编: 时间:2024-06-12 17:31:35 82观看
导读大家好,我是煎鱼。最近也是面试季+毕业季了,很多同学正在积极准备面试。尤其是很多同学,已经通过官网资料熟悉了 Go 基本语法,但没有太大把握。希望对一些常见的棘手面试问题做一些预习。今天和大家学习 @Harutyun Mardir

大家好,我是煎鱼。XtU28资讯网——每日最新资讯28at.com

最近也是面试季+毕业季了,很多同学正在积极准备面试。尤其是很多同学,已经通过官网资料熟悉了 Go 基本语法,但没有太大把握。希望对一些常见的棘手面试问题做一些预习。XtU28资讯网——每日最新资讯28at.com

今天和大家学习 @Harutyun Mardirossian 大佬分享的面试题,一起进步!XtU28资讯网——每日最新资讯28at.com

面试问题

请先在脑子里思考一下具体的运行结果,再查看答案。XtU28资讯网——每日最新资讯28at.com

如下代码:XtU28资讯网——每日最新资讯28at.com

func main() {    s := make([]int, 0, 2)    doSomething(s)    fmt.Println(s)}func doSomething(a []int) {    a = append(a, 1)}

面试问题:fmt.Println 的输出结果是什么?XtU28资讯网——每日最新资讯28at.com

问题解析

运行程序,查看输出结果:XtU28资讯网——每日最新资讯28at.com

[]

fmt.Println 最终打印的是一个长度为 0 的切片。XtU28资讯网——每日最新资讯28at.com

答案是:空切片。(你答对了吗?)XtU28资讯网——每日最新资讯28at.com

在 Go 中,函数参数是按值传递的,这意味着上述代码在参数传递时,创建了参数值的副本并传递给函数。XtU28资讯网——每日最新资讯28at.com

而切片实际上是一个包含长度(len)、容量(cap)和指向底层数组指针(data)的结构体。XtU28资讯网——每日最新资讯28at.com

当我们将切片作为函数参数传递时,实质上复制的是切片的 SliceHeader,对应的底层数组是保持不变的。XtU28资讯网——每日最新资讯28at.com

结合代码来讲,就是因为在 doSomething 函数中,创建了 SliceHeader 的新副本。然后 append 函数会在超过容量时重新分配新切片,并返回更新后的切片。XtU28资讯网——每日最新资讯28at.com

深入验证

我们可以使用 unsafe 包去打印 SliceHeader(切片头),进行进一步的验证和分析。XtU28资讯网——每日最新资讯28at.com

如下代码:XtU28资讯网——每日最新资讯28at.com

type SliceHeader struct {    Data uintptr    Len  int    Cap  int}func main() {    s := make([]int, 0, 2)    sh := (*SliceHeader)(unsafe.Pointer(&s))    fmt.Println(sh)    doSomething(s)}func doSomething(a []int) {    a = append(a, 1)    sh := (*SliceHeader)(unsafe.Pointer(&a))    fmt.Println(sh)}

输出结果:XtU28资讯网——每日最新资讯28at.com

&{1374389592336 0 2} // main&{1374389592336 1 2} // doSomething

两个切片的 Data 指针地址指向的是同一个底层数组。但由于长度不同,它们在应用的表现上是两个不同的切片。XtU28资讯网——每日最新资讯28at.com

这也印证了前面问题的结果是输出了空切片,切片长度为 0 的内部原理。XtU28资讯网——每日最新资讯28at.com

变通方法

这种情况下,建议是修改写法,提高代码易读性。否则后续维护也比较麻烦,不熟悉的同学咋一眼一看很有可能发现不了问题。XtU28资讯网——每日最新资讯28at.com

但如果你还是希望输出你想要的切片值,可以采取以下变通方法。XtU28资讯网——每日最新资讯28at.com

改动后的代码:XtU28资讯网——每日最新资讯28at.com

func main() {    s := make([]int, 0, 2)    doSomething(s)    fmt.Println(s[:1]) // 进行新的切片操作}func doSomething(a []int) {    a = append(a, 1)}

输出结果:XtU28资讯网——每日最新资讯28at.com

[1]

原因是在进行 s[:1] 切片操作时,本质上是创建了一个新的 SliceHeader,所以可以正常打印和获取预期的元素。XtU28资讯网——每日最新资讯28at.com

当然,还有一种常见的写法就是切片 append 等变更后一定做一遍再赋值,这样可以规避掉不少使用上的细节坑。XtU28资讯网——每日最新资讯28at.com

总结

今天这篇文章讨论了一个很常见的 Go 面试问题,内容涉及切片作为函数参数的传递和修改。XtU28资讯网——每日最新资讯28at.com

重点在于切片作为参数是按值传递的,因此函数内部的修改不会影响外部变量。XtU28资讯网——每日最新资讯28at.com

如果仍然希望获取可以通过切片操作,重新切分一下新的切片结果集就可以了。XtU28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-93368-0.htmlGo 面试中的隐藏陷阱:SliceHeader 问题解析

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: C#托管堆遭破坏问题溯源分析

下一篇: 基于 Spring Boot 与 WebSocket 实现实时车位管理与状态更新

标签:
  • 热门焦点
  • vivo TWS Air开箱体验:真轻 臻好听

    vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 把LangChain跑起来的三个方法

    把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 一文搞定Java NIO,以及各种奇葩流

    一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 慕岩炮轰抖音,百合网今何在?

    慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz“难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?”这一番话,出自百合网联合创
  • 2天涨粉255万,又一赛道在抖音爆火

    2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了——贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 余承东:AI大模型技术的发展将会带来下一代智能终端操作系统的智慧体验

    余承东:AI大模型技术的发展将会带来下一代智能终端操作系统的智慧体验

    8月4日消息,2023年华为开发者大会(HDC.Together)今天正式开幕,华为发布HarmonyOS 4、全新升级的鸿蒙开发套件、HarmonyOS Next开发者预览版本等一系列
  • Windows 11发布,微软一改往常对老机型开放的态度

    Windows 11发布,微软一改往常对老机型开放的态度

    距离 Windows 11 发布已经过去一周,在过去一周里,很多数码爱好者围绕其对 Android 应用的支持、对老机型的升级问题展开了激烈讨论。与以往不同的是,在这次大
  • 中关村论坛11月25日开幕,15位诺奖级大咖将发表演讲

    中关村论坛11月25日开幕,15位诺奖级大咖将发表演讲

    11月18日,记者从2022中关村论坛新闻发布会上获悉,中关村论坛将于11月25至30日在京举行。本届中关村论坛由科学技术部、国家发展改革委、工业和信息化部、国务
Top