小智 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()将被执行。这里无限循环!
| 归档时间: |
|
| 查看次数: |
3712 次 |
| 最近记录: |