为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
吃鸡游戏 2023-06-01 18:05:19
我是一个新的地鼠,如果我定义了一个自定义错误,我真的被变量类型搞糊涂了    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 的类型到底是什么?为什么“错误”是一个接口,也可以用作返回类型?非常感谢
查看完整描述

2 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

您必须区分变量的“静态类型”和“动态类型”。

Go 中的每个变量都有一个静态类型。一些例子:

  • 在声明isa := 5的静态类型之后,关于.ainta

  • e您代码中的静态类型是error(因为这是errorGen返回的)。

  • 您可以像这样明确说明静态类型var b uint16 = 9

现在 Go 中有接口类型。error是这样的接口类型,请参阅彼得的回答。一些变量将具有error静态类型;你e就是一个例子。现在,接口类型变量的全部目的是存储实现该接口的各种类型的值。因此,一个不是 nil 的接口变量以某种方式“包含”另一个变量(实际上是一个值)。此包含值的类型可以是实现接口的任何类型。包含值的类型是“动态类型”。类型断言让您可以提取此动态类型的值。


查看完整回答
反对 回复 2023-06-01
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

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)。


查看完整回答
反对 回复 2023-06-01
  • 2 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信