2014-07-25 101 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

相關問題