在 Go 语言中,error 是用于处理错误的内置接口。它是处理错误的重要工具,在标准库中定义为以下形式:
type error interface {
Error() string
}
任何实现了 Error() string 方法的类型都可以作为一个 error 类型。Error 方法的作用是返回错误的描述信息。
使用 error 的常见方法
- 返回
error类型的值 通常函数会返回一个error类型,用于标识是否发生了错误。如果没有错误,通常返回nil。
func divide(a, b int) (int, error) {
if b == 0 {
return 0, fmt.Errorf("cannot divide by zero")
}
return a / b, nil
}
func main() {
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Result:", result)
}
2.创建自定义错误
使用标准库中的 errors.New 或 fmt.Errorf 创建错误。
import (
"errors"
"fmt"
)
var ErrInvalidInput = errors.New("invalid input")
func validate(input int) error {
if input < 0 {
return ErrInvalidInput
}
return nil
}
func main() {
err := validate(-1)
if err != nil {
fmt.Println("Error:", err)
}
}
3.实现自定义错误类型
你可以定义自己的类型,实现 Error 方法以满足 error 接口。
jstype MyError struct {
Code int
Message string
}
func (e MyError) Error() string {
return fmt.Sprintf("Error %d: %s", e.Code, e.Message)
}
func doSomething() error {
return MyError{Code: 404, Message: "Resource not found"}
}
func main() {
err := doSomething()
if err != nil {
fmt.Println(err)
}
}
后端入门的AI练中学代码示例:
import (
"errors"
"fmt"
)
type user struct {
name string
password string
}
func findUser(users []user, name string) (v *user, err error) {
for _, u := range users {
if u.name == name {
return &u, nil
}
}
return nil, errors.New("not found")
}
func main() {
u, err := findUser([]user{{"wang", "1024"}}, "wang")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(u.name) // wang
if u, err := findUser([]user{{"wang", "1024"}}, "li"); err != nil {
fmt.Println(err) // not found
return
} else {
fmt.Println(u.name)
}
}
这段代码中 error 的使用主要体现在以下几个方面:
1. 定义和返回 error 对象
return nil, errors.New("not found")
当在用户列表中找不到匹配的用户时,通过 errors.New 创建了一个新的 error 对象并返回。
2. 检查 error 值
在 main 函数中,通过 if err != nil 或 if ...; err != nil 来检查 error 是否为空:
if err != nil {
fmt.Println(err)
return
}
这是 Go 语言处理错误的标准方式,通过判断返回的 error 是否为 nil,决定程序的逻辑分支。
3. 错误处理分支
当 error 不为 nil 时,打印错误消息并通过 return 提前结束逻辑:
fmt.Println(err) // 打印错误信息
return // 提前结束程序逻辑
4. 简洁语法 if ...; err != nil
Go 支持在 if 条件中先执行一段赋值逻辑,随后判断 err:
if u, err := findUser([]user{{"wang", "1024"}}, "li"); err != nil {
fmt.Println(err) // not found
return
} else {
fmt.Println(u.name)
}
这种语法在代码块内声明了一个新的变量 u,并且只在这个块内有效。