fmt.Print(myError)没有隐式调用Error()?

时间:2014-08-05 23:55:14

标签: go

我想在我的自定义错误结构中打印所有内容,例如fmt.Print()打印任何其他结构,但由于它实现了error,它只打印一个字段,即我通过Error()传递的字段。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

您可以键入断言自定义类型的error接口。请注意,理想情况下,在执行此操作时应使用“逗号,确定”惯用法,否则如果类型断言失败,您的应用程序将会发生混乱。

package main

import "fmt"

type MyError struct {
    Status  int
    Message string
}

func (e MyError) Error() string {
    return e.Message
}

func BadThing() error {
    return MyError{404, "Not found"}
}

func main() {
    err := BadThing()
    if err != nil {
        if v, ok := err.(MyError); ok {
            fmt.Printf("%+v\n", v.Status) // or v, or v.Message, etc.
        }
        fmt.Printf("%v\n", err) // Fallback. Can wrap in this in an 'else' if needed.
    }
}

Playground - 并进一步阅读:http://blog.golang.org/error-handling-and-go