登录
首页 >  Golang >  Go问答

这两个错误值有什么区别?

来源:stackoverflow

时间:2024-03-30 18:18:34 231浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《这两个错误值有什么区别?》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

我试图理解 golang 接口,我的问题是为什么 err2.what undefined。

这是一个简单的代码。输出表明 err 和 err2 与 *main.myerror 具有相同的类型,但 err2 没有字段“what”,因此 err 和 err2 之间肯定存在一些差异,但我无法弄清楚这里的差异。我刚开始学习 golang 不久,任何帮助将不胜感激。

package main

import (
        "fmt"
        "time"
        "reflect"
)

type MyError struct {
        When time.Time
        What string
}

func (e *MyError) Error() string {
        return fmt.Sprintf("at %v, %s",
                e.When, e.What)
}

func run() error {
        return &MyError{
                time.Now(),
                "it didn't work",
        }
}

func main() {
        err := &MyError{time.Now(), "Hello"}
        fmt.Println(reflect.TypeOf(err))
        fmt.Println(err.What)   

        err2 := run()
        fmt.Println(reflect.TypeOf(err2))
        fmt.Println(err2.What)
}

预期输出:

main.myerror

你好

main.myerror

it 不起作用

实际输出:

\# 命令行参数 ./test.go:34:18: err2.what undefined(类型错误没有字段或方法what)


解决方案


函数run()返回类型为error的值,这是一个接口类型。是的,它包装了具体类型 *myerror 的值,但要访问 myerror 的字段,您需要使用 type assertion

fmt.println(err2.(*myerror).what)

Go Playground上试试。

请注意,error 类型的值可能包含其他具体类型的值,实际上是任何实现 error 接口的值。如果它包含其他类型的值,上述类型断言将导致运行时恐慌。

如果您不确定 err2 实际上持有 *myerror 类型的值,并且您想避免运行时恐慌,您可以使用类型断言的特殊形式来获取此信息,并且仅在情况如此时才采取行动: p>

if myerror, ok := err2.(*MyError); ok {
    fmt.Println(myerror.What) // Here myerror has static type *MyError
} else {
    fmt.Println("Some other error:", err2)
}

拨打 Go Playground 试试这个。

以上就是《这两个错误值有什么区别?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>