发布时间:2022-10-04 17:00
大家好,我是煎鱼。
前段时间脉脉在搞一个 “我来出一道面试题” 的讨论系列,其中一位脉友 @在宿雾参观的小冬瓜 出了一道 Go 题目。
来和一起回答回答,看看知识掌握的怎么样。
Go 题目如下:
func main() {
var nums1 []interface{}
nums2 := []int{1, 3, 4}
num3 := append(nums1, nums2)
fmt.Println(len(num3))
}
请选择程序的运行结果(答案)是什么?
题主似乎是西昌学院的小伙伴。这里配上原题目的图(挡一下答案,选择题选完再往下看)。
如下图:
程序运行结果:
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 一些东西在使用时,很容易会因为下意识的理解而导致出错,导致误解。
你在面试或工作中有没有遇到过这些问题呢?欢迎在评论区留言和交流。
Go 想要加个箭头语法,这下更像 PHP 了!
Go 错误处理新思路?用左侧函数和表达式