相关疑难解决方法(0)

错误,无限循环

我正在阅读Go语言教程.

我想查看这个问题的答案:

注意:fmt.Sprint(e)Error方法内部的调用会将程序发送到无限循环.您可以通过e先转换来避免这种情况:fmt.Sprint(float64(e)).为什么?

我相信这是因为当Sprint调用函数时,由于错误是非零的,所以Error function()将再次调用,依此类推,从而导致无限循环.

go

28
推荐指数
2
解决办法
3712
查看次数

由Error方法中的fmt.Sprint(e)生成的无限循环

根据fortyforty对这个问题的回复:

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

您可以通过将e值转换为不带StringError方法的值 来中断递归.

这对我来说仍然令人困惑.为什么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

12
推荐指数
2
解决办法
2035
查看次数

标签 统计

go ×2