面试题答案
一键面试1. panic 和普通错误在处理机制上的不同
- 普通错误:
- 处理方式:Go语言提倡通过返回值来传递错误。函数调用者可以通过检查返回的错误值,决定后续的处理逻辑,程序可以继续运行而不中断。例如标准库
os.Open
函数,打开文件失败时返回一个错误值。 - 调用栈:普通错误不会导致程序的调用栈展开,仅影响当前函数及调用它的函数的执行流程。
- 适用场景:适用于可恢复的错误情况,程序可以在处理错误后继续正常运行。
- 处理方式:Go语言提倡通过返回值来传递错误。函数调用者可以通过检查返回的错误值,决定后续的处理逻辑,程序可以继续运行而不中断。例如标准库
- panic:
- 处理方式:当
panic
发生时,当前函数会立即停止执行,并且逐层向上展开调用栈,直到有recover
捕获到panic
或者程序最终崩溃。例如在一个函数内部调用panic("something went wrong")
,会开始展开调用栈。 - 调用栈:会导致整个调用栈展开,输出详细的错误信息,包括发生
panic
的函数调用层级等,有助于定位问题。 - 适用场景:适用于不可恢复的错误,比如程序运行的前提条件不满足,如数据库连接配置缺失等,这种情况下程序无法继续正常运行。
- 处理方式:当
2. 普通错误处理场景举例
package main
import (
"fmt"
"os"
)
func readFileContent(filePath string) (string, error) {
data, err := os.ReadFile(filePath)
if err != nil {
return "", err
}
return string(data), nil
}
func main() {
content, err := readFileContent("nonexistentfile.txt")
if err != nil {
fmt.Printf("Error reading file: %v\n", err)
// 这里可以选择其他处理方式,比如使用默认内容,或者提示用户重新输入文件名等
return
}
fmt.Println(content)
}
在上述代码中,os.ReadFile
函数返回错误时,readFileContent
函数将错误返回给调用者 main
函数,main
函数根据错误情况决定如何处理,程序可以继续执行其他逻辑。
3. panic 适用场景举例
package main
import (
"fmt"
)
func setupDatabase() {
// 假设这里从配置文件读取数据库连接信息
config := getDatabaseConfig()
if config == nil {
panic("Database configuration is missing. Cannot start application.")
}
// 后续代码建立数据库连接等操作
fmt.Println("Database setup completed.")
}
func getDatabaseConfig() map[string]string {
// 实际应从配置文件读取,这里简单返回 nil 模拟配置缺失
return nil
}
func main() {
setupDatabase()
// 如果数据库配置缺失,程序无法继续,panic 会导致程序崩溃并输出详细错误信息
fmt.Println("Application started.")
}
在这个例子中,如果数据库配置缺失,程序无法继续运行,使用 panic
来表明这种不可恢复的错误,程序会立即停止并输出错误信息。