Go 语言通过 error 类型和 defer 语句提供了一种简单而有效的错误处理和资源管理机制。
错误处理
Go 语言使用返回值而不是异常来表示错误,通常在函数的最后一个返回值中返回 error 类型的值,它是一个接口类型,具有一个 Error()方法。
func divide(x, y float64) (float64, error) {
if y == 0 {
return 0, errors.New("division by zero")
}
return x / y, nil
}
在调用一个可能返回错误的函数时,需要检查其返回值是否为 nil,如果不为 nil,说明发生了错误,需要进行相应的处理。
result, err := divide(10, 0)
// 通过判断err是否为nil,可以确定是否发生了错误
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
panic 和 recover 用于处理不可恢复的错误或异常情况。panic 会中断当前函数的执行,并沿着调用栈向上抛出一个错误值,直到被 recover 捕获或者程序终止。
recover 只能在 defer 函数中调用,用于获取 panic 抛出的错误值,并恢复正常的执行流程。
func recoverDemo() {
defer func() {
if err := recover(); err != nil {
fmt.Println("Recovered:", err)
}
}()
panic("出错啦")
}
func main() {
recoverDemo()
fmt.Println("run...")
}
panic 和 recover 应该谨慎使用,一般只用于处理一些无法预料或无法处理的错误,比如空指针引用、数组越界等。
资源管理
Go 语言的 defer 语句用于延迟执行某个函数调用,通常用于关闭或释放一些资源,比如文件、数据库连接、锁等。
defer 语句可以有多个,它们会按照后进先出的顺序执行。
无论函数是否发生错误,defer 语句都会在函数返回之前执行。
func processResource() {
fmt.Println("连接数据库...")
defer fmt.Println("释放连接...")
// 使用资源进行一些操作
}
func main() {
processResource()
fmt.Println("done")
}