为什么golang自定义错误变量有多种类型

我是一个新的地鼠,如果我定义了一个自定义错误,我真的被变量类型搞糊涂了


    import (

        "fmt"

        "reflect"

    )


    // custom errors

    type myError struct {

        msg string

    }


    func (m *myError) Error() string {

        return m.msg

    }


    func errorGen() error {

        return &myError{"custom error"}

    }

生成一个新错误并检查它的类型


    func main() {

        e := errorGen()

        fmt.Println(reflect.TypeOf(e).Kind()) // type = pointer


        // first type assertion

        _, ok := e.(error)

        if ok {

            fmt.Println("type assertion error") // type = error

        }


        // second type assertion

        _, ok = e.(*myError)

        if ok {

            fmt.Println("type assertion *myError") // type = pointer

        }

    }

所以在上面的代码中,变量“e”同时显示了两种类型。e 的类型到底是什么?为什么“错误”是一个接口,也可以用作返回类型?


非常感谢


吃鸡游戏
浏览 108回答 2
2回答

沧海一幻觉

您必须区分变量的“静态类型”和“动态类型”。Go 中的每个变量都有一个静态类型。一些例子:在声明isa := 5的静态类型之后,关于.aintae您代码中的静态类型是error(因为这是errorGen返回的)。您可以像这样明确说明静态类型var b uint16 = 9:现在 Go 中有接口类型。error是这样的接口类型,请参阅彼得的回答。一些变量将具有error静态类型;你e就是一个例子。现在,接口类型变量的全部目的是存储实现该接口的各种类型的值。因此,一个不是 nil 的接口变量以某种方式“包含”另一个变量(实际上是一个值)。此包含值的类型可以是实现接口的任何类型。包含值的类型是“动态类型”。类型断言让您可以提取此动态类型的值。

眼眸繁星

Go 编程语言规范错误预先声明的类型错误定义为type error interface {     Error() string     }它是表示错误条件的常规接口,nil 值表示没有错误。接口类型接口类型指定称为其接口的方法集。接口类型的变量可以存储任何类型的值,方法集是接口的任何超集。据说这样的类型实现了接口。e实现预先声明的接口类型error。    // first type assertion    _, ok := e.(error)    if ok {        fmt.Println("type assertion error") // type = error    }e的具体类型是指向类型的指针myError。    // second type assertion    _, ok = e.(*myError)    if ok {        fmt.Println("type assertion *myError") // type = pointer    }两种类型断言都为真 ( okis true)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go