我正在阅读 The Go Programming Language 一书,并在其中描述了错误包和接口
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使用 a实现的测试代码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)
当然,这有一个缺点,因为碰巧具有相同错误字符串的不同错误将评估为相等,这是我们不想要的。
MM们
Qyouu
相关分类