string - 这两个err值有什么区别?

标签 string go methods go-interface

我试图理解 golang 接口(interface),我的问题是为什么 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
没有成功

实际输出:

\# 命令行参数 ./test.go:34:18: err2.What undefined (type error has no field or method What)

最佳答案

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

fmt.Println(err2.(*MyError).What)

Go Playground 上试试.

请注意,error 类型的值可能包含其他具体类型的值,实际上是任何实现了 error 接口(interface)的类型。如果它将包含另一种类型的值,上述类型断言将导致运行时 panic 。

如果你不确定 err2 是否真的持有一个 *MyError 类型的值并且你想避免运行时 panic ,你可以使用特殊形式的类型断言来获取此信息并仅在情况如此时采取行动:

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 上试试这个.

关于string - 这两个err值有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57035266/

相关文章:

c# - 替换由数字组成的子字符串

go - 为什么 go package code 没有 body?

javascript - 代码返回未定义而不是返回值

java - Java中清理字符串的方法

javascript - 计算单个字母在单词中出现的次数

for-loop - Golang for循环中按索引构造变量名的最有效方法

go - golang 中原始值的 typedef 是否等效?

Python 类方法改变自身

java - 需要帮助才能从正在运行的类中运行方法

java - 在 Java 8 中将实例方法作为参数传递