2016-11-21 08:34
浏览 213



package main

import (

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{
        "it didn't work",

func main() {
    if err := run(); err != nil {

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:

    解决 无用
    打赏 举报

相关推荐 更多相似问题