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

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


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 {


慕村225694
浏览 94回答 1
1回答

尚方宝剑之说

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 中,它通常指的是内部包含指针的类型(接口、映射等),尽管我猜它也包括指针。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go