小智 47
fmt.Sprint(e)
将调用e.Error()
将值转换e
为a string
.如果Error()
方法调用fmt.Sprint(e)
,则程序会递归直到内存不足.
您可以通过将e
值转换为不带String
或Error
方法的值来中断递归.
小智 17
fmt.Sprint(e) 将调用“fmt/print.go”中的以下代码
switch verb {
case 'v', 's', 'x', 'X', 'q':
// 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, "Error")
p.fmtString(v.Error(), verb)
return
case Stringer:
handled = true
defer p.catchPanic(p.arg, verb, "String")
p.fmtString(v.String(), verb)
return
}
}
Run Code Online (Sandbox Code Playgroud)
当错误情况首先出现时,v.Error()将被执行。这里无限循环!