本文最初发表在我的个人博客,查看原文,获得更好的阅读体验
一 错误
1.1 error类型
按照约定,Go中的错误类型为error
,这是一个内建接口,nil
值表示没有错误:
type error interface {
Error() string
}
我们可以很方便的自定义一个错误类型:
package main
import (
"fmt"
)
func main() {
e := MyError{
"This is a custom Error Type."}
fmt.Println(e.Error())
v1, err := divide(10, 2)
if err == nil {
fmt.Println(v1)
}
if v2, err := divide(5, 0); err != nil {
fmt.Println(err)
} else {
fmt.Println(v2)
}
}
// 自定义错误类型
type MyError struct {
msg string
}
func (e *MyError) Error() string {
return e.msg
}
// 取整除法
func divide(a1, a2 int) (int, error) {
if a2 == 0 {
return 0, &MyError{
"整数相除,除数不能为零"}
}
return a1 / a2, nil
}
上述divide
函数会返回一个error
值,调用方可以根据这个错误值来判断如何处理结果。这种用法在Go中是一种惯用法,尤其在编写一些函数库之类的功能时。例如标准库os
中的打开文件的Open
函数定义如下:
// Open opens the named file for reading. If successful, methods on
// the returned file can be used for reading; the associated file
// descriptor has mode O_RDONLY.
// If there is an error, it will be of type *PathError.
func Open(name string) (*File, error)