Go语言基础语法之error|豆包MarsCode AI刷题

74 阅读2分钟

在 Go 语言中,error 是用于处理错误的内置接口。它是处理错误的重要工具,在标准库中定义为以下形式:

type error interface {
    Error() string
}

任何实现了 Error() string 方法的类型都可以作为一个 error 类型。Error 方法的作用是返回错误的描述信息。

使用 error 的常见方法

  1. 返回 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.Newfmt.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 != nilif ...; 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,并且只在这个块内有效。