2014-07-25 106 views
1

为什么当你使用否定比较错误与零如果提供预期的输出,但当你试图比较它使用'积极'的运算符'不起作用'?我觉得代码见下面为什么错误不匹配零?去

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!

+7

你是故意插入函数'makeError'到变量'err'中,还是那个错误?尝试用'err:= makeError()'和'err = noError()' –

+3

首先:仔细阅读http://golang.org/doc/faq#nil_error。第二:解决安德烈亚斯指出的问题。 – Volker

回答

4

在您的示例代码,err不是错误值。用下面的任务:

err := makeError 

errfunc() error类型。 err != nil成功,因为makeError函数不是nil。同样,noError也是一个功能,并不等于nil

如果你真的调用函数,你应该得到你期望的结果。

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

相关问题