我正在阅读Go语言教程。
我想查看这个问题的答案:
注意:在fmt.Sprint(e)
方法内调用Error
会将程序发送到无限循环。您可以先转换e
fmt.Sprint(float64(e))
来避免这种情况。为什么呢?
我认为这是因为当调用Sprint
函数时,由于错误是非零的,因此将再次调用Error function()
,依此类推,从而导致无限循环。
答案 0 :(得分:40)
fmt.Sprint(e)
会致电e.Error()
将值e
转换为string
。如果Error()
方法调用fmt.Sprint(e)
,则程序会递归直到内存不足。
您可以通过将e
转换为不使用String
或Error
方法的值来中断递归。
答案 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()。这里无休止的循环!