go - 如何将错误作为值而不是引用返回
问题描述
我正在创建一个自定义错误并将其用作函数返回:
type MyError struct {
Name string
}
func (me *MyError) Error() string {
return me.Name + " is my error"
}
返回自定义错误的函数:
func (anyStruct *AnyStruct) Validate() error {
// if Any verification {
return &MyError{Name: "MyError"}
//}
}
为什么我不能作为值而不是引用返回?如果我尝试作为值返回:
return MyError{Name: "MyError"}
编辑器的 linter 抱怨一个错误:
不能使用(MyError 文字)(MyError 类型的值)作为返回语句中的错误值:缺少方法错误
此外,我对返回引用但函数签名没有通知将返回指针这一事实感到困惑:
func (anyStruct *AnyStruct) Validate() error {
代替func (anyStruct *AnyStruct) Validate() *error {
解决方案
error
是一个接口类型,因此可以用作错误的类型必须实现该Error()
方法。您的代码中实现的类型Error()
是*MyError
(即指向MyError 的指针)。返回时Validate()
,返回值被隐式转换为错误 - 只有*MyError
(而不是MyError
)可以转换为error
.
要执行您想要的操作,您应该使用MyError
implement Error()
。
func (me MyError) Error() string {
return me.Name + " is my error"
}
请注意,如果函数返回error
返回值,则返回的任何类型都将存储在接口中(记住error
是接口类型)。和大多数类型一样,指针可以存储在接口中。还要小心使用“引用”类型这个词——在 Go 中,它通常指的是内部包含指针的类型(接口、映射等),尽管我猜它也包括指针。
推荐阅读
- javascript - Selenium WebDriver 中的 JavascriptException
- javascript - 如何从 json 输出中检索值
- mysql - 如何连接2个查询SQL
- javascript - VueX 通过提交更新状态
- php - 制作不等数组控制
- c# - 使用 EF Core 进行循环依赖检查
- wicket - 嗨,我目前正在将 wicket 应用程序从 1.5.3 升级到 6.30.0,但我收到错误并且登录页面没有被实例化
- sqlite - SQLite:结果集的内部联接
- php - 如何计算/显示数字为“前 5”、“前 10”、“前 15”等?
- python - 如何在kivy中更新RecycleView中的数据?