首页 > 解决方案 > 如何将错误作为值而不是引用返回

问题描述

我正在创建一个自定义错误并将其用作函数返回:

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 {

标签: go

解决方案


error是一个接口类型,因此可以用作错误的类型必须实现该Error()方法。您的代码中实现的类型Error()*MyError(即指向MyError 的指针)。返回时Validate(),返回值被隐式转换为错误 - 只有*MyError(而不是MyError)可以转换为error.

要执行您想要的操作,您应该使用MyErrorimplement Error()

func (me MyError) Error() string {
    return me.Name + " is my error"
}

请注意,如果函数返回error返回值,则返回的任何类型都将存储在接口中(记住error是接口类型)。和大多数类型一样,指针可以存储在接口中。还要小心使用“引用”类型这个词——在 Go 中,它通常指的是内部包含指针的类型(接口、映射等),尽管我猜它也包括指针。


推荐阅读