0
点赞
收藏
分享

微信扫一扫

fmt.Sprint(e)死循环

七千22 2022-01-25 阅读 41
package main

import (
	"fmt"
)
type ErrFloat float64
func (e ErrFloat ) Error() string{
	return fmt.Sprintf("cannot Sqrt negative number: %v",e)
	//return fmt.Sprintf(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.Sprintf(e)等价于fmt.Sprintf(e.Error()).

然而e.Error()又会调用fmt.Sprintf(e),
然后就出现无限递归的死循环了.
怎么解决呢?
可以fmt.Sprintf(e)修改为fmt.Sprintf(float64(e))
举报

相关推荐

0 条评论