为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
白猪掌柜的 2021-09-10 10:02:47
我想检查一下这个问题的答案:注意:fmt.Sprint(e)对Error方法内部的调用将使程序进入无限循环。您可以通过e先转换来避免这种情况 :fmt.Sprint(float64(e)). 为什么?我相信这是因为在Sprint调用函数时,由于错误非零,Error function()将再次调用,依此类推,导致无限循环。
查看完整描述

2 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

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

您可以通过将 the 转换为e没有StringorError方法的值来中断递归。


查看完整回答
反对 回复 2021-09-10
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

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()。无限循环在这里!


查看完整回答
反对 回复 2021-09-10
  • 2 回答
  • 0 关注
  • 350 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信