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")
}