脉脉网友出了道 Go 面试题,你能答对吗?

大家好,我是煎鱼。

前段时间脉脉在搞一个 “我来出一道面试题” 的讨论系列,其中一位脉友 @在宿雾参观的小冬瓜 出了一道 Go 题目。

来和一起回答回答,看看知识掌握的怎么样。

题目

Go 题目如下:

func main() {
 var nums1 []interface{}
 nums2 := []int{1, 3, 4}
 num3 := append(nums1, nums2)
 fmt.Println(len(num3))
}

请选择程序的运行结果(答案)是什么?

答案

题主似乎是西昌学院的小伙伴。这里配上原题目的图(挡一下答案,选择题选完再往下看)。

如下图:

c864204fe50035daccdd4e788858968f.png

程序运行结果:

1

也就是答案是选项一,输出结果是 1。

你答对了吗?我们继续。

既然变量 num3 的长度是 1。那这里 1 个里,塞的是什么。

代码如下:

var nums1 []interface{}
 nums2 := []int{1, 3, 4}
 num3 := append(nums1, nums2)
 fmt.Println(num3)

输出结果是 1,还是 3,还是 4?

程序运行结果:

[[1 3 4]]

这一次你答对了吗?

是为什么呢?

解析

这个 Go 题目,本质上是比较容易被误导,一个不小心就选错了。我们来看看 append 函数的官方定义是怎么样的。

如下函数签名:

func append(slice []Type, elems ...Type) []Type

官方对函数的作用描述是:append 函数会将元素追加到切片的末尾。

再认真看看题目中的代码片段:

var nums1 []interface{}
 nums2 := []int{1, 3, 4}
 num3 := append(nums1, nums2)

结合定义,可得知就是会把 nums2 这个元素,追加到 nums1 变量的末尾,并不会出现什么拆开变量内的值分别追加的情况。

自然也就呼之欲出了,变量 num3 的长度只会等于 1,而这个 1 就是 nums2 变量内的元素。非常的纯天然没加工过。

总结

这道题其实从逻辑上来讲并不复杂。但 Go 一些东西在使用时,很容易会因为下意识的理解而导致出错,导致误解。

你在面试或工作中有没有遇到过这些问题呢?欢迎在评论区留言和交流。

更多阅读

关注和加煎鱼微信,

获取一手业内消息和知识,拉你进交流群👇

85157418656e2131a6cd1648daf9a160.jpeg

8cf2afc5a7cbd31109d29bedba665300.png

你好,我是煎鱼,出版过 Go 畅销书《Go 语言编程之旅》,再到获得 GOP(Go 领域最有观点专家)荣誉,点击蓝字查看我的出书之路

日常分享高质量文章,输出 Go 面试、工作经验、架构设计,加微信拉读者交流群,和大家交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值