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

为什么返回在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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 宇视监控服务器无法登录
  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥15 DruidDataSource一直closing
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
  • ¥50 STM32单片机传感器读取错误
  • ¥50 power BI 从Mysql服务器导入数据,但连接进去后显示表无数据