为什么当你使用负面比较错误和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
}
答案 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()错误没有实现错误(缺少错误方法)
答案 1 :(得分:4)
在您的示例代码中,err
不是错误值。通过以下任务:
err := makeError
err
的类型为func() error
。 err != nil
成功,因为makeError
函数不是nil
。同样,noError
也是一个函数,不等于nil
。
如果您实际调用这些函数,则应该得到预期的结果。