指针 – golang和指针接收器中的自定义错误
通过Web和stackoverflow读取值接收器与指针接收器,我理解基本规则:如果你不打算修改接收器,接收器相对较小,则不需要指针.
然后,阅读关于实现错误接口(例如https://blog.golang.org/error-handling-and-go),我看到Error()函数的示例都使用指针接收器. 然而,我们没有修改接收器,结构非常小. 我觉得没有指针的代码更好(return& appError {} vs return appError {}). 这些示例是否有使用指针的原因? 解决方法
首先,你链接的博客文章和你的例子,appError不是一个错误.它是一个包含错误值的包装器和示例实现所使用的其他相关信息,它们不会公开,并且不会将appError和* appError用作错误值.
因此,您引用的示例与您的实际问题无关.但要回答标题中的问题: 一般来说,一致性可能是原因.如果一个类型有很多方法而且有些需要指针接收器(例如因为它们修改了值),通常用指针接收器声明所有方法是有用的,所以对于类型的method sets和指针类型没有混淆. 回答关于错误的实现:当你使用struct值来实现错误值时,使用非指针来实现错误接口是危险的.为什么会这样? 因为 详细说明并举例说明: 标准库具有 // Package errors implements functions to manipulate errors. package errors // New returns an error that formats as the given text. func New(text string) error { return &errorString{text} } // errorString is a trivial implementation of error. type errorString struct { s string } func (e *errorString) Error() string { return e.s } 该实现返回一个指向非常简单的struct值的指针.这样,如果您使用相同的字符串值创建2个错误值,它们将不相等: e1 := errors.New("hey") e2 := errors.New("hey") fmt.Println(e1,e2,e1 == e2) 输出: hey hey false 这是故意的. 现在,如果你要返回一个非指针: func New(text string) error { return errorString{text} } type errorString struct { s string } func (e errorString) Error() string { return e.s } 具有相同字符串的2个错误值将相等: e1 = New("hey") e2 = New("hey") fmt.Println(e1,e1 == e2) 输出: hey hey true 试试Go Playground上的例子. 一个很好的例子,为什么这很重要:查看存储在变量 var EOF = errors.New("EOF") 预期 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |