2017-06-13 67 views
0

有人可以提供有關此代碼的行爲的一些解釋: https://play.golang.org/p/_TjQhthHl3轉到指針接口不爲空

package main 

import (
    "fmt" 
) 

type MyError struct{} 
func (e *MyError) Error() string { 
    return "some error" 
} 

func main() { 
    var err error 
    if err == nil { 
     fmt.Println("[OK] err is nil ...") 
    }else{ 
     fmt.Println("[KO] err is NOT nil...") 
    } 
    isNil(err) 


    var err2 *MyError 
    if err2 == nil { 
     fmt.Println("[OK] err2 is nil ...") 
    }else{ 
     fmt.Println("[KO] err2 is NOT nil...") 
    } 
    isNil(err2) 
} 

func isNil(err error){ 
    if err == nil { 
     fmt.Println("[OK] ... still nil") 
    }else{ 
     fmt.Println("[KO] .. why not nil?") 
    } 
} 

輸出是:

[OK] err is nil ... 
[OK] ... still nil 
[OK] err2 is nil ... 
[KO] .. why err2 not nil? 

我發現這個職位Check for nil and nil interface in Go,但我還是不得到它...

+2

另請參閱常見問題解答:https://golang.org/doc/faq#nil_error – JimB

回答

2

error是一個內置的接口,以及*MyError實現該接口。儘管err2的值爲零,但當您將其傳遞給isNil時,該函數將獲得非零接口值。該值包含有關類型(*MyError)和值本身的信息,它是一個零指針。

如果您嘗試在isNil中打印err,您會發現在第二種情況下,即使err2爲零,也會出現「某些錯誤」。這說明了爲什麼err在這種情況下不是零(它必須包含類型信息)。

1

從我的理解你的var err2 *MyError定義是生成一個指向結構定義的指針和NOT一個實際的實例化對象。

+0

這並不能解釋爲什麼它不是'nil'。它聲明一個指針,並用'nil'值初始化它。 – zerkms

1

在Go中,接口類型由具有2個字段的結構表示:一個表示其實際類型,另一個表示指向該值的指針。

這意味着接口值永遠不會等於nil,除非您傳遞的值實際上是nil值。

相關和相談甚歡:GopherCon 2016: Francesc Campoy - Understanding nil