今天我将给大家带来一篇《这两个错误值有什么区别?》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!
问题内容
我试图理解 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 类型的值,并且您想避免运行时恐慌,您可以使用类型断言的特殊形式来获取此信息,并且仅在情况如此时才采取行动:
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 试试这个。