Я читаю книгу программирования Go Go и в ней описывается пакет ошибок и интерфейс
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 }
говорится
Основной тип errorString - это структура, а не строка, чтобы защитить свое представление от непреднамеренных (или преднамеренных) обновлений.
Что это значит? Разве пакет не скроет базовый тип, поскольку errorString
не экспортируется?
Обновление
Вот тестовый код, который я использовал для реализации errorString
, используя вместо него string
. Обратите внимание, что при попытке использовать его из другого пакета вы не можете просто назначить строку как ошибку.
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) }
И тестирование его с помощью предлагаемых кодов
func main() {
err := errors.New("foo")
err = "bar"
fmt.Prinln(err)
}
В результате создается ошибка при компиляции
cannot use "bar" (type string) as type testerr.Error in assignment:
string does not implement testerr.Error (missing Error method)
Конечно, для этого существует недостаток, поскольку разные ошибки, которые имеют одну и ту же строку ошибок, будут оцениваться как равные, которые мы не хотим.