错误,无限循环

时间:2014-12-14 22:32:05

标签: go

我正在阅读Go语言教程。

我想查看这个问题的答案:

注意:在fmt.Sprint(e)方法内调用Error会将程序发送到无限循环。您可以先转换e fmt.Sprint(float64(e))来避免这种情况。为什么呢?

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

2 个答案:

答案 0 :(得分:40)

fmt.Sprint(e)会致电e.Error()将值e转换为string。如果Error()方法调用fmt.Sprint(e),则程序会递归直到内存不足。

您可以通过将e转换为不使用StringError方法的值来中断递归。

答案 1 :(得分:0)

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()。这里无休止的循环!