我正在阅读Go语言教程.
我想查看这个问题的答案:
注意:fmt.Sprint(e)对Error方法内部的调用会将程序发送到无限循环.您可以通过e先转换来避免这种情况:fmt.Sprint(float64(e)).为什么?
我相信这是因为当Sprint调用函数时,由于错误是非零的,所以Error function()将再次调用,依此类推,从而导致无限循环.
根据fortyforty对这个问题的回复:
fmt.Sprint(e)将调用e.Error()将值转换e为astring.如果Error()方法调用fmt.Sprint(e),则程序会递归直到内存不足.您可以通过将
e值转换为不带String或Error方法的值 来中断递归.
这对我来说仍然令人困惑.为什么fmt.Sprint(e)调用e.Error()而不是String()?我尝试使用Stringer接口,这是我的代码:
package main
import (
"fmt"
"math"
)
type NegativeSqrt float64
func (e NegativeSqrt) Error() string {
fmt.Printf(".")
return fmt.Sprint(e)
}
func (e NegativeSqrt) String() string {
return fmt.Sprintf("%f", e)
}
func Sqrt(x float64) (float64, error) {
if x < 0 {
return 0, NegativeSqrt(x)
}
return math.Sqrt(x), nil
}
func main() {
fmt.Println(Sqrt(2))
fmt.Println(Sqrt(-2))
}
Run Code Online (Sandbox Code Playgroud) go ×2