在Go语言里,错误是一种普通的值,通过内置的error接口来表达。函数发生异常状况时,一般把error作为最后一个返回参数,由调用者决定如何处理。理解Golang错误如何返回以及error的基本语法,是写出健壮服务的基础。

error接口与基本语法
error是Go内置的一个接口,定义非常简单,只有一个Error方法返回字符串描述:
// error接口的内置定义
type error interface {
Error() string
}
最常见的返回方式是在函数签名末尾加上error类型,正常时返回nil,出错时返回具体错误对象。
使用errors.New返回错误
对于简单错误,可以使用errors包创建:
package main
import (
"errors"
"fmt"
)
// 除法函数,除数为0时返回错误
func divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("除数不能为0")
}
return a / b, nil
}
func main() {
result, err := divide(10, 0)
if err != nil {
fmt.Println("出错:", err)
return
}
fmt.Println("结果:", result)
}
使用fmt.Errorf包装错误
当需要带上上下文信息,可以使用fmt.Errorf:
package main
import (
"fmt"
)
func readFile(name string) error {
return fmt.Errorf("读取文件%s失败", name)
}
错误返回的基本规范
在Golang中,关于错误返回有一些广泛遵循的规范:
- error永远放在函数返回列表的最后一位
- 不要忽略错误,至少打日志或向上传递
- 返回错误时,正常返回值应置为零值
- 使用小写开头的错误信息,符合Go习惯
自定义错误类型
如果调用方需要区分错误种类,可以自定义实现error接口的结构体:
package main
import "fmt"
// 自定义错误类型
type MyError struct {
Code int
Msg string
}
func (e *MyError) Error() string {
return fmt.Sprintf("code:%d msg:%s", e.Code, e.Msg)
}
func doTask() error {
return &MyError{Code: 500, Msg: "服务异常"}
}
错误判断的常用写法
调用函数后,应使用if err != nil进行判断,再决定后续逻辑:
result, err := divide(10, 2)
if err != nil {
// 处理错误,例如日志记录并退出当前流程
return
}
// 正常使用result
在Go 1.13之后,可以使用errors.Is和errors.As来做更精确的错误比较与类型提取,这也是目前推荐的写法。
小结
掌握Golang错误如何返回,核心就是理解error作为值的本质,把error放在返回值末尾,出错时返回非nil并在调用处显式处理。遵循这些基本语法与规范,可以让代码更可读、更易排查问题。