错误返回非空的值

Why is my nil error value not equal to nil

算是面试题吧,对于理解golang的Interface有帮助,interface怎样才算空?var err error = nil,这样的申明,err就是空的了吗?答案是:当然是空啦,上代码,看结果会比较清楚

package main
import (
    "fmt"
    "github.com/go-openapi/errors"
)

func test1() error {
    var err error = nil
    if err != nil {
        return errors.New(200, "danger") //不会进
    }
    return err
}
func main() {
    t := test1()
    if t != nil {
        fmt.Println("true")
    } else {
        fmt.Println("false")
    }
}

结果为false。也就是返回是空的。

那我们看下面代码:

package main

import (
    "fmt"
    "github.com/go-openapi/errors"
)

type myError struct {
}

func (m myError)Error() string {//myError实现了error接口的Error方法
    return "test"
}

func test1() error {
    var err *myError = nil
    if err != nil {
        return errors.New(200, "danger") //不进
    }
    return err
}

func main() {
    t := test1()
    if t != nil {
        fmt.Println("true")
    } else {
        fmt.Println("false")
    }
}

结果是:true.第二个输出结果显示返回不为空。就是err的类型不一样,导致最后判空结果不一样,但是第二个例子中的err明明是Nil,不然会进test1()中的那个判空啊。原因是啥呢?

因为接口存储分为类型T和值V,V是具体值,例如我们将类型为int的3存储进接口,接口表现为T=INT,V= 3。接口只有当V为nil且T为nil时才会判为空。所以例2中test1()返回中,从*myError转换为error。所以error是要存储原数据类型的,返回结果为T=**myError,V= nil。最终显示该值不为空。

参看文章:https://golang.org/doc/faq#nil_error

最后更新于