Go基础面试题, Go 语言中触发异常的场景有哪些?
Go基础面试题, Go 语言中触发异常的场景有哪些?
QA
Step 1
Q:: Go 语言中触发异常的场景有哪些?
A:: 在 Go 语言中,触发异常的场景主要包括以下几种:1) 数组越界访问:访问数组或切片的索引超出其长度时会触发 'index out of range' 异常;2) nil 指针解引用:尝试对空指针(nil)进行访问或操作时会触发 'nil pointer dereference' 异常;3) 类型断言失败:对接口类型进行类型断言时,如果断言的类型与实际类型不匹配,会触发 'interface conversion' 异常;4) 通道操作异常:在关闭的通道上进行发送操作或从 nil 通道读取数据时,会触发异常;5)
内存不足:由于内存不足而无法分配内存时,Go 运行时会触发异常。
Step 2
Q:: Go 语言如何处理异常?
A:: Go 语言通过 panic 和 recover 机制处理异常。panic 是用来触发异常的,可以理解为手动引发一个错误。当程序遇到无法继续执行的严重错误时,可以调用 panic 函数。recover 是用来捕获异常的,可以在 defer 函数中调用 recover 来捕获 panic,并阻止程序崩溃。通常情况下,panic 应该只用于处理那些不可恢复的错误,如程序逻辑错误或运行时异常,而不是用来处理普通的错误情况。
Step 3
Q:: 在 Go 中,何时使用 panic 而不是 error?
A:: 在 Go 中,panic 应该用于那些不可恢复的错误情境,例如程序逻辑中的严重错误、无法处理的运行时错误或程序不应该继续执行的情形。error 则用于表示可以预期和处理的错误,通常在函数返回值中使用 error 表示执行过程中出现的问题。通常的原则是,当错误可以被调用者处理时,使用 error;当错误不应该被处理且程序应该终止时,使用 panic。
Step 4
Q:: Go 语言中的 defer 关键字如何与异常处理机制配合使用?
A:: defer 关键字用于注册一个延迟执行的函数,该函数会在当前函数返回之前执行。在处理异常时,defer 通常用于释放资源或捕获 panic。通过在 defer 中调用 recover,可以捕获 panic 并防止程序崩溃,从而进行适当的处理或记录日志。这样可以在程序出现严重错误时,仍能优雅地退出或执行一些清理操作。
Step 5
Q:: Go 语言中的 runtime 包有什么作用?
A:: Go 的 runtime 包提供了与 Go 程序运行时系统交互的功能,如控制 goroutine、内存分配、垃圾回收和获取调用栈信息。该包中的某些功能(如 debug.Stack() 或 runtime.Goexit())在调试、优化程序性能以及处理异常时非常有用。例如,在处理异常时,可以通过 debug.Stack()
获取堆栈信息,帮助定位问题。