Go通过error接口实现错误处理,支持errors.New和fmt.Errorf创建基础错误,推荐用结构体实现Error方法以携带详细信息,使用errors.Is和errors.As进行错误判断与类型提取,并通过%w包装错误保留上下文和底层错误链。

在Go语言中,错误处理是程序设计的重要组成部分。Go通过内置的error接口来表示错误,开发者可以声明自定义错误类型,并结合标准库提供的工具进行灵活处理。
最简单的错误声明方式是使用errors.New或fmt.Errorf创建一个基础错误:
import "errors"
var ErrNotFound = errors.New("record not found")
var ErrInvalidInput = fmt.Errorf("invalid input: %s", "email")
对于需要携带更多信息的场景,建议定义结构体类型并实现error接口的Error()方法:
type ValidationError struct {
Field string
Msg string
}
func (e *ValidationError) Error() string {
return fmt.Sprintf("validation error on field '%s': %s", e.Field, e.Msg)
}
// 使用示例
err := &ValidationError{Field: "email", Msg: "invalid format"}
处理错误时,通常先判断是否为nil,非nil即表示出错:
立即学习“go语言免费学习笔记(深入)”;
if err != nil {
log.Println("operation failed:", err)
return err
}
若要区分具体错误类型,可使用errors.Is和errors.As(推荐用于Go 1.13+):
if errors.Is(err, ErrNotFound) {
// 处理记录未找到的情况
}
var validationErr *ValidationError
if errors.As(err, &validationErr) {
fmt.Printf("字段 %s 出错:%s\n", validationErr.Field, validationErr.Msg)
}
有时需要在不暴露内部细节的前提下添加上下文信息,可用%w动词包装错误:
_, err := os.Open("config.json")
if err != nil {
return fmt.Errorf("failed to read config: %w", err)
}
这样既保留了原始错误,又提供了更丰富的上下文,同时仍能通过errors.Is或errors.As追溯底层错误。
基本上就这些。Go的错误机制简洁但足够强大,关键是合理设计错误类型、规范使用包装与解包,让调用方能准确感知并响应异常情况。
以上就是Golang错误类型如何声明与处理的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号