059- error 接口

1. error 接口

一直以来,我们到处都能看到 error 作为很多函数的返回值类型出现,我们也没太关注它,一般都以下面这样的形式看到它:

// err := ...
if err != nil {
    fmt.Printf("%v\n", err)
}

这个 error 实际上是接口类型:

type error interface {
    Error() string
}

2. 创建 error 对象

从概念上说,只要你的类型实现了 Error 方法,那它就可以实例化出 error 对象。在 Go 里有一个典型的例子是 Errno 类型:

package syscall

type Errno uintptr
func (e Errno) Error() string

其实它就是 POSIX 操作系统中定义的错误码类型。

我们也可以使用 errors 包中的 New 函数来快速创建一个 error 对象:

package main

import (
    "errors"
    "fmt"
)

func main() {
    err := errors.New("这是一个 error 对象")
    if err != nil {
        fmt.Print(err)
    }
}

3. 判断 error 类型

我们经常会有判断某个函数返回 error 类型的需求,比如:

package main

import (
    "fmt"
    "syscall"
)

func main() {
    _, err := syscall.Open("./test.txt", syscall.O_RDONLY, 0)

    // 下一节就会讲到的语法
    if e, ok := err.(syscall.Errno); ok && e == 2 {
        fmt.Printf("Error: %v\n", e)
    }
}

syscall.Open 函数返回的第一个值是文件描述符,这里我们忽略它。第二个返回值是一个实现了 error 接口的类型,实际上它就是 syscall.Errno 类型,不过我们并不能确定,因此我们使用了下面的语法:

if e, ok := err.(syscall.Errno); ok && e == 2

上面这简单的说就是先判断 err 接口的类型部分是不是 syscall.Errno 类型,如果是,再判断 e 的值是不是 2.

这段语法在 Go 里叫类型断言,下一讲,我们继续。

4. 总结

  • 掌握 error 接口

猜你喜欢

转载自blog.csdn.net/q1007729991/article/details/80715670