Sto leggendo il libro Go linguaggio di programmazione e nella sua descrizione del pacchetto di errore e l'interfacciaPerché ErrorString una struttura, non è una stringa
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 }
si dice
Il tipo sottostante di errorString è una struct, non una stringa, per proteggere la sua rappresentazione da aggiornamenti involontari (o premeditati).
Cosa significa? Il pacchetto non nasconderà il tipo sottostante dal momento che errorString
non viene esportato?
Aggiornamento Ecco il codice di prova che ho usato attuazione errorString
utilizzando un string
invece. Nota che quando provi ad usarlo da un altro pacchetto, non puoi semplicemente assegnare una stringa come un errore.
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) }
E testarlo con i codici suggeriti
func main() {
err := errors.New("foo")
err = "bar"
fmt.Prinln(err)
}
finirà per produrre un errore durante la compilazione
cannot use "bar" (type string) as type testerr.Error in assignment: string does not implement testerr.Error (missing Error method)
Naturalmente c'è un aspetto negativo a questo dato diverso gli errori che capita di avere la stessa stringa di errore valuteranno per essere uguali a quelli che non vogliamo.
Controllare la modifica. – shebaw
@shebaw vedo. Ho lasciato l'interfaccia 'error' fuori dall'equazione. Ho rivisto la mia risposta. –
Immagino che e la seconda spiegazione fornita dal libro sia, se avessimo fatto in modo che 'errorString' fosse una stringa, allora qualsiasi errore che capita di avere la stessa stringa di errore valuterà come' True'. Es: 'io.EOF == errors.New (" EOF ")' che non è corretto. – shebaw