Go语言通过返回error类型显式处理错误,如divide函数在除数为0时返回fmt.Errorf错误;调用时需检查err是否为nil,若自定义DivideError类型可携带更多错误信息,结合errors.As和%w包装实现高效错误判断与链式处理。

在Go语言中,错误处理是函数设计的重要部分。Go通过返回
error类型来表示操作是否成功,而不是使用异常机制。下面是一个完整的示例,展示如何定义函数、返回错误以及在调用端进行处理。
定义可能出错的函数
假设我们要实现一个除法函数,它在除数为0时返回错误。
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, fmt.Errorf("cannot divide by zero")
}
return a / b, nil
}
这个函数返回两个值:结果和一个
error。如果
b为0,使用
fmt.Errorf创建一个带有描述信息的错误。正常情况下返回计算结果和
nil表示无错误。
调用函数并处理错误
调用
divide时,必须检查第二个返回值是否为
nil来判断是否出错。
立即学习“go语言免费学习笔记(深入)”;
result, err := divide(10, 2)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Result: %.2f\n", result)
这是标准的错误处理模式。如果
err不为
nil,说明发生了错误,应进行相应处理(如打印、记录日志或提前返回)。只有在
err为
nil时才使用返回的结果。
自定义错误类型
对于更复杂的场景,可以定义自己的错误类型,实现
error接口的
Error()方法。
type DivideError struct {
x, y float64
}
func (e *DivideError) Error() string {
return fmt.Sprintf("division error: divide %.2f by %.2f", e.x, e.y)
}
func safeDivide(a, b float64) (float64, error) {
if b == 0 {
return 0, &DivideError{x: a, y: b}
}
return a / b, nil
}
这样可以在错误中携带更多信息。调用方可以通过类型断言判断具体错误类型:
result, err := safeDivide(5, 0)
if err != nil {
if divErr, ok := err.(*DivideError); ok {
fmt.Println("Custom error:", divErr.Error())
} else {
fmt.Println("Unknown error:", err)
}
return
}
常见错误处理技巧
实际开发中,错误处理可以结合以下方式:
- 使用
errors.Is
和errors.As
(Go 1.13+)进行错误比较和类型提取 - 在错误链中包装原始错误,使用
fmt.Errorf("...: %w", err) - 在关键路径上尽早返回错误,避免嵌套
例如:
_, err := divide(10, 0)
if err != nil {
return fmt.Errorf("operation failed: %w", err)
}
基本上就这些。Go的错误处理强调显式检查和清晰流程,虽然代码略多,但逻辑更透明,易于维护。










