fmt.Sprintln(e)死循环
Posted live4m
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fmt.Sprintln(e)死循环相关的知识,希望对你有一定的参考价值。
package main
import (
"fmt"
)
type ErrFloat float64
func (e ErrFloat ) Error() string
return fmt.Sprintf("cannot Sqrt negative number: %v",e)
//return fmt.Sprintln(e)
func Sqrt(x float64) (float64, error)
if x<0
return 0,ErrNegativeSqrt(x)
return 1, nil
func main()
fmt.Println(Sqrt(2))
fmt.Println(Sqrt(-2))
fmt.Println(Sqrt(-2))出错无输出
原理:
ErrFloat实现了Error接口成为Error类型,
打印时会调用e.Error()拿到错误信息,
因此fmt.Sprintln(e)等价于fmt.Sprintln(e.Error()).
然而e.Error()又会调用fmt.Sprintln(e),
然后就出现无限递归的死循环了.
怎么解决呢?
可以fmt.Sprintln(e)修改为fmt.Sprintln(float64(e))
以上是关于fmt.Sprintln(e)死循环的主要内容,如果未能解决你的问题,请参考以下文章
html 当图片获取失败时会触发onerror的事件,在该事件中可以重新定义SRC,未防再次获取图片失败导致死循环,需要重置的onerror事件为空。