golang中这段代码在print时,为何会输出Error()方法的执行结果

package main

import (
    "fmt"
    "strconv"
)

//ErrNegativeSqrt is alias of float64
type ErrNegativeSqrt float64

//String return the value of string
func (e ErrNegativeSqrt) String() string {
    return strconv.FormatFloat(float64(e), 'g', 10, 64) + " is the result"
}

func (e ErrNegativeSqrt) Error() string {
    return fmt.Sprint(float64(e), " occurs the error")
}

func main() {
    var a ErrNegativeSqrt = 2
    fmt.Println(a)
}

为什么这段代码会输出 Error() 方法的结果?当把Error()方法删除后,就会输出String()方法的结果?

阅读 4.4k
3 个回答

摘抄一段print.go中的代码,也许是你想要的答案?

// Is it an error or Stringer?
// The duplication in the bodies is necessary:
// setting handled and deferring catchPanic
// must happen before calling the method.
switch v := p.arg.(type) {
case error:
    handled = true
    defer p.catchPanic(p.arg, verb)
    p.fmtString(v.Error(), verb)
    return

case Stringer:
    handled = true
    defer p.catchPanic(p.arg, verb)
    p.fmtString(v.String(), verb)
    return
}
新手上路,请多包涵

在fmt.Println的实现里面会做类型断言,看是否实现error接口和string接口,如果实现了就会调用。如果输出不是期望的格式,用fmt.Printf

因为你实现了 Error 方法,ErrNegativeSqrt 也可以被认为是一个 Error 类型,因此在转换为 String 类型输出时,调用的是 对应的 Error 方法所返回的字符串。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题