I The Go Programmiersprache Buch lese und in seiner Beschreibung des Fehlers Paket und die SchnittstelleWarum eine Struktur ist error, kein String
package errors
type error interface {
Error() string
}
func New(text string) error { return &errorString{text} }
type errorString struct { text string }
func (e *errorString) Error() string { return e.text }
es sagt
Der zugrunde liegende Typ von errorString ist eine Struktur, keine Zeichenfolge, um ihre Darstellung vor unbeabsichtigten (oder vorsätzlichen) Aktualisierungen zu schützen.
Was bedeutet das? Würde das Paket den zugrunde liegenden Typ nicht verbergen, da errorString
nicht exportiert wird?
aktualisieren Hier ist der Testcode I errorString
stattdessen eine string
verwendet, um die Umsetzung. Beachten Sie, dass Sie eine Zeichenfolge nicht einfach als Fehler zuweisen können, wenn Sie versuchen, sie aus einem anderen Paket zu verwenden.
package testerr
type Error interface {
Error() string
}
func New(text string) Error {
return errorString(text)
}
type errorString string
func (e errorString) Error() string { return string(e) }
und -prüfung es mit den vorgeschlagenen Codes
func main() {
err := errors.New("foo")
err = "bar"
fmt.Prinln(err)
}
Wird bis ein Fehler enden beim Kompilieren
cannot use "bar" (type string) as type testerr.Error in assignment: string does not implement testerr.Error (missing Error method)
Natürlich gibt es ein Nachteil dazu da unterschiedliche Fehler, die dieselbe Fehlerzeichenfolge haben, werden als gleichwertig bewertet, was wir nicht wollen.
Bitte überprüfen Sie die Bearbeitung. – shebaw
@shebaw ich sehe. Ich habe die "Fehler" -Schnittstelle aus der Gleichung heraus gelassen. Ich habe meine Antwort überarbeitet. –
Ich denke, dass und die zweite Erklärung, die das Buch gibt, ist, hatte wir 'errorString' zu einer Zeichenkette gemacht, dann wird jeder Fehler, der dieselbe Fehlermeldung hat, zu' True' ausgewertet. Bsp .: 'io.EOF == errors.New (" EOF ")' was falsch ist. – shebaw