面试题
一、选择题
1.关于异常设计,下面说法正确的是()
A. 在程序开发阶段,坚持速错,让程序异常崩溃 // 开发--测试--准生产--生产
B. 在程序部署后,应恢复异常避免程序终止
C. 一切皆错误,不用进行异常设计
D. 对于不应该出现的分支,使用异常处理
参考答案:ABD
2.关于异常的触发,下面说法正确的是()
A. 空指针解析
B. 下标越界
C. 除数为0
D. 调用panic函数
参考答案:ABCD
3.关于函数返回值的错误设计,下面说法正确的是()
A. 如果失败原因只有一个,则返回bool
B. 如果失败原因超过一个,则返回error
C. 如果没有失败原因,则不返回bool或error
D. 如果重试几次可以避免失败,则不要立即返回bool或error
参考答案:ABCD
4.下面关于recover使用正确的是?
A.recover()
B.defer recover()
C.defer func() {
recover()
}()
D. defer func() {
defer func() {
recover()
}()
}()
答案:C。recover() 必须在 defer() 函数中直接调用才有效。,不能嵌套使用,不能直接使用
5.函数执行时,如果由于 panic 导致了异常,则延迟函数不会执行。这一说法是否正确?
A. 正确
B. 错误
参考答案及解析:B。 defer结合recover可以修复panic
6.错误是业务过程的一部分,而异常不是,这句话是否正确()
A.正确
B.错误
答案:A。异常是要避免的
二、简答题
1.写出下面代码的输出
package main
import "fmt"
func main() {
defer_all()
panic("触发异常")
}
func defer_all() {
defer func() {
fmt.Println("打印前")
}()
defer func() {
fmt.Println("打印中")
}()
defer func() {
fmt.Println("打印后")
}()
}
这道题主要考察的是对 defer 的理解,defer 主要是延迟函数,延迟到调用者函数执行 return 命令之前
2.写出下面代码的执行结果
package main
import (
"fmt"
)
func main() {
defer_call()
}
func defer_call() {
defer func() { fmt.Println("打印前") }()
defer func() { fmt.Println("打印中") }()
defer func() { fmt.Println("打印后") }()
panic("触发异常")
}
打印后
打印中
打印前
panic: 触发异常
参考解析:defer 的执行顺序是先进后出,后进先出
当出现 panic 语句的时候,会先按照 defer 的后进先出的顺序执行,最后才会执行panic
3.下面代码的执行结果为?
package main
import "fmt"
func main() {
a := 1
b := 2
defer Sum( a, b)
a = 3
defer Sum( a, b)
b = 4
}
func Sum(a, b int) {
ret := a + b
fmt.Println(a, b, ret)
}
答案:defer先进后出,后进先出
4.下面代码能正常编译吗?
package main
import "fmt"
func main() {
nil := 1
var map_data map[string]int = nil
fmt.Println(map_data)
}
答案:不能,此时的nil是int类型的变量