Zgodnie z odpowiedzią fortyforty do this question:nieskończona pętla wytwarzać fmt.Sprint (e) wewnątrz metodą błędów
fmt.Sprint(e)
wywołae.Error()
konwertować wartośće
dostring
. Jeśli metodaError()
wywoła , wówczas program powtarza się, aż do wyczerpania pamięci.można przerwać rekurencję przekształcając
e
do wartości bez metodyString
lubError
.
To wciąż jest mylące dla mnie. Dlaczego fmt.Sprint (e) wywołuje funkcję e.Error() zamiast String()? Próbowałem przy użyciu interfejsu Stringer, to mój kod:
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))
}
Po "edycji" ta odpowiedź wyjaśnia teraz, dlaczego Takie zachowanie, dzięki. –
_ ** Edytuj: ** Poprawiłem link. Podany link nie działa. podawaj linki, wskazując na commit, a nie na mistrza, może się zmienić. –