dongwo5940
2016-11-21 08:34
浏览 174
已采纳

为什么返回在golang中实现错误接口的类型会自动调用Error()方法?

Link: https://play.golang.org/p/z50pUnAe4q

package main

import (
    "fmt"
    "time"
)

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() {
    if err := run(); err != nil {
        fmt.Println(err)
    }
}

I understand that the built in type error looks like this,

type error interface {
    Error() string
}

Meaning MyError implements error. The run() method returns a pointer to MyError type.

But the return type of run() method in the method signature is of type error.

How does the return statement in run() automatically call the Error() method?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • duanla1996 2016-11-21 08:41
    已采纳

    Here fmt.Println() is responsible for calling Error() method not run().

    Quoting from docs:

    The fmt package formats an error value by calling its Error() string method.

    It is the error implementation's responsibility to summarize the context. The error returned by os.Open formats as "open /etc/passwd: permission denied," not just "permission denied." The error returned by our Sqrt is missing information about the invalid argument.

    Hence, when you're trying to print err inside main() its Error() method is getting invoked.

    Replace it with something else, then you won't see it in output: https://play.golang.org/p/IqScH02iGu

    点赞 打赏 评论

相关推荐 更多相似问题