开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 16 天,点击查看活动详情
今天来学习下Go常见的习题问题(二十六),也是面试中可能会遇到的,让我们来一起学习吧~
panic 异常
如果程序执行过程中,遇到panic引发异常,那么延迟函数defer不会正常执行?该说法是否正常?
- true
- false 参考答案:选择false,由panic 引发异常以后,程序停止执行,紧接着调用延迟函数(defer)。和正常程序退出一样
slice与数组
观察下列代码,判断输出结果是什么?
func main() {
a := [3]int{0, 1, 2}
s := a[:1]
s[0] = 11
s = append(s, 12)
s = append(s, 13)
s = append(s, 14)
s[0] = 21
fmt.Println(a, len(a), cap(a))
fmt.Printf("%p\n", &a)
fmt.Printf("%p\n", s)
fmt.Println(s, len(s), cap(s))
}
参考答案:
输出结果为:
[11 12 13] 3 3
0x1400012e000
0x14000124060
[21 12 13 14] 4 6
数组a的长度和容量都是固定不变的,切片的长度是可以变化的,从原数组创建一个新的切片出来,切片底层的指针指向原数组,所以修改切片s就是修改底层数组a,但是你会发现最后一步修改了s[0]原数组却没有变化,因为此时的切片s已经新开了一片内存空间,因为上一个添加操作已经超出了cap的容量3的的大小,所以会新开一个切片出来,复制原来数组的值,修改s[0]是在新的切片上进行修改,所以不会对原数组有影响。
总结
今天浅谈了Go的习题(二十六),主要介绍了GO面试中会出现的问题,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!