Go 如何将错误作为值而不是引用返回

Go 如何将错误作为值而不是引用返回,go,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 { retur

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

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"}

    //}
}
为什么我不能作为值而不是引用返回?如果我尝试作为值返回:

返回MyError{Name:MyError}

编辑的linter抱怨了一个错误:

无法将MyError类型的MyError文本值用作返回语句中的错误值:缺少方法错误

此外,我还感到困惑的是,正在返回一个引用,但函数签名没有通知将返回一个指针:

func anyStruct*anyStruct Validate error{而不是func anyStruct*anyStruct Validate*error{

error是一种接口类型,因此可以用作错误的类型必须实现error方法。代码中实现error的类型是*MyError,即指向MyError的指针。当Validate返回时,返回值将隐式转换为错误-只能将*MyError而不是MyError转换为错误

要执行您想要的操作,您应该使用MyError实现错误


请注意,如果函数返回错误,则无论返回何种类型,返回值都将存储在接口中。记住,错误是一种接口类型。与大多数类型一样,指针也可以存储在接口中。另外,请小心使用reference type-in Go这个词,它通常指内部包含poi的接口、映射等类型nters,但我猜它也会包括指针。

关于linter为什么要使用指针,请查看投票最多的答案。关于返回类型为什么是error而不是*error,这是因为error是一个接口,如果您愿意,可以在内置包中找到它。@phonaputer了解返回类型为什么是error而不是*error*错误,这是因为错误是一个可以在内置包中找到的接口,如果您想查看它,是否意味着每当函数的返回类型是一个接口时,即使返回是一个引用,我也不需要指针标志*?是的,这是正确的。您可能想了解接口在Go中的工作方式。
func (me MyError) Error() string {
    return me.Name + " is my error"
}