为什么错误不匹配?走

时间:2014-07-25 09:43:09

标签: go

为什么当你使用负面比较错误和nil if if提供预期输出但是当你尝试使用'positive'运算符进行比较时它'不起作用'?我认为代码见下文

package main

import "fmt"
import "errors"

func main() {
    err := makeError
    if err != nil {
        fmt.Println("as expected")

        err = noError
        if err == nil {
            fmt.Println("as expected")
        } else {
            fmt.Println("Why no error ?")
        }
    }
}

func makeError() error {
    return errors.New("error!")
}

func noError() (err error) {
    return
}

Play this thing!

2 个答案:

答案 0 :(得分:4)

问题是你没有调用你的函数,而是将函数本身分配给你的变量。因此,err值始终与nil不同。

示例:

func foo() error {
    return nil
}

func bar() error {
    return errors.New("error")
}

// err will be the same as the foo function
// you can then do err()
err := foo

// err will be an error var, nil in this case
// err != nil will return false
err := foo()

// err will be an error var, equivalent to errors.New("error")
err := bar()

如果您尝试创建变量然后分配给它,您的编译器将对您大喊(如预期的那样)。示例:

func foo() error {
    return nil
}

var err error
err = foo

将为您提供以下编译器错误

  

不能在赋值时使用foo(类型func()错误)作为类型错误:   func()错误没有实现错误(缺少错误方法)

playground

答案 1 :(得分:4)

在您的示例代码中,err不是错误值。通过以下任务:

err := makeError

err的类型为func() errorerr != nil成功,因为makeError函数不是nil。同样,noError也是一个函数,不等于nil

如果您实际调用这些函数,则应该得到预期的结果。