面试题答案
一键面试设计思路
- 资源管理:使用Go语言的
defer
关键字来确保在函数结束时释放资源。无论是正常结束还是因为panic
异常结束,defer
语句都会执行,从而保证数据库连接、文件句柄等资源被正确关闭。 - 异常恢复:在函数中使用
recover
函数来捕获panic
异常。将可能引发panic
的代码块放在defer
语句调用recover
的函数之前,这样当panic
发生时,recover
可以捕获到该异常,进行相应处理。
代码示例
package main
import (
"fmt"
"os"
)
// 模拟数据库连接
type Database struct {
// 实际连接对象等属性
}
func (db *Database) Connect() {
fmt.Println("Database connected")
}
func (db *Database) Disconnect() {
fmt.Println("Database disconnected")
}
// 模拟复杂业务逻辑函数
func complexBusinessLogic() {
var db Database
db.Connect()
defer db.Disconnect()
file, err := os.Open("test.txt")
if err != nil {
fmt.Println("Failed to open file:", err)
return
}
defer file.Close()
// 模拟可能引发 panic 的代码
panic("Simulated panic")
// 后续代码不会执行,因为已经 panic
fmt.Println("Business logic completed")
}
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
complexBusinessLogic()
fmt.Println("Main function continues")
}
在上述代码中:
complexBusinessLogic
函数中,使用defer
确保数据库连接db
在函数结束时断开连接,文件file
在函数结束时关闭。main
函数中,通过defer
和recover
捕获并处理complexBusinessLogic
函数中可能发生的panic
异常。这样既保证了资源的正确释放,又实现了异常的恢复。