面试题答案
一键面试错误(error)和异常(panic)的区别
- 错误(error):
- 性质:Go语言中,
error
是一种内建接口类型,用于表示函数执行过程中遇到的可预期错误。它是一种常规的错误处理机制,适合在程序的正常流程中处理可能出现的错误情况。 - 处理方式:通常通过函数的返回值返回
error
,调用者通过检查返回的error
值来决定后续的处理逻辑。
- 性质:Go语言中,
- 异常(panic):
- 性质:
panic
用于表示程序运行时遇到的不可恢复的错误或异常情况,会导致程序立即停止当前函数的执行,并开始展开调用栈。如果没有recover
捕获,程序最终会崩溃。 - 处理方式:
panic
一般用于程序遇到严重错误,例如非法的输入、违反程序的不变量等,这种情况下程序无法继续正常执行。
- 性质:
使用if err != nil
进行错误处理的示例
package main
import (
"fmt"
"os"
)
func readFileContents(filePath string) (string, error) {
data, err := os.ReadFile(filePath)
if err != nil {
return "", err
}
return string(data), nil
}
func main() {
content, err := readFileContents("nonexistentfile.txt")
if err != nil {
fmt.Printf("Error reading file: %v\n", err)
return
}
fmt.Println("File contents:", content)
}
在上述示例中,os.ReadFile
可能会返回一个error
,通过if err != nil
检查,如果有错误,就返回错误信息,调用者在main
函数中捕获并处理这个错误,打印错误信息并结束程序。
何时使用panic
较为合适
- 非法输入:
- 当函数接收到不符合预期的输入,且这种情况无法在正常流程中合理处理时,可以使用
panic
。
在这个func divide(a, b int) int { if b == 0 { panic("division by zero") } return a / b }
divide
函数中,如果除数为0,这是一个非法输入,无法在正常的除法逻辑中处理,所以使用panic
。 - 当函数接收到不符合预期的输入,且这种情况无法在正常流程中合理处理时,可以使用
- 违反程序不变量:
- 例如在一个实现栈的程序中,当试图从空栈中弹出元素时,可以使用
panic
。
这里从空栈弹出元素违反了栈的逻辑,属于不可恢复的错误,适合用type Stack struct { data []int } func (s *Stack) Pop() int { if len(s.data) == 0 { panic("pop from empty stack") } top := s.data[len(s.data)-1] s.data = s.data[:len(s.data)-1] return top }
panic
。 - 例如在一个实现栈的程序中,当试图从空栈中弹出元素时,可以使用