猿问

为什么在 Error() 方法中调用 fmt.Sprint(e) 会导致无限循环?

我想检查一下这个问题的答案:

注意:fmt.Sprint(e)Error方法内部的调用将使程序进入无限循环。您可以通过e先转换来避免这种情况 :fmt.Sprint(float64(e)). 为什么?


我相信这是因为在Sprint调用函数时,由于错误非零,Error function()将再次调用,依此类推,导致无限循环。


白猪掌柜的
浏览 351回答 2
2回答

牧羊人nacy

fmt.Sprint(e)将调用e.Error()将值转换e为 a string。如果Error()方法调用fmt.Sprint(e),则程序将递归,直到内存不足。您可以通过将 the 转换为e没有StringorError方法的值来中断递归。

陪伴而非守候

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        }    }当首先出现错误情况时,将执行 v.Error()。无限循环在这里!
随时随地看视频慕课网APP

相关分类

Go
我要回答