浅谈Go与习题(二十六)

90 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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面试中会出现的问题,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!