Nach fortyforty Antwort auf this question:Eine Endlosschleife durch fmt.Sprint produziert (e) innerhalb der Error-Methode
fmt.Sprint(e)
wirde.Error()
rufen Sie den Werte
zu einemstring
zu konvertieren. Wenn die MethodeError()
fmt.Sprint(e)
aufruft, wird das Programm solange rekursiv ausgeführt, bis kein Speicher mehr verfügbar ist.Sie können die Rekursion durchbrechen, indem die
e
auf einen Wert ohne ein VerfahrenString
oderError
konvertieren.
Das ist immer noch verwirrend für mich. Warum ruft fmt.Sprint (e) e.Error() statt String() auf? Ich versuchte, die Stringer-Schnittstelle, das ist mein Code:
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))
}
Nach Ihrer "edit", diese Antwort jetzt erklärt, warum wir ha Dieses Verhalten, danke. –
_ ** Bearbeiten: ** Ich habe den Link repariert. Der angegebene Link funktionierte nicht. Geben Sie Links an, indem Sie auf einen Commit zeigen, nicht auf den Master, er kann sich ändern._ –