2016-02-16 23 views
2

今天我遇到了一個奇怪的bug。我有一個功能:golang的無效vs無?

func Foo(s *someStruct) { 
    fmt.Printf("s is %v\n", s) 
    if s!=nil { 
     fmt.Printf("s is not nil") 
     ... 
    } 
} 

我會打電話的功能等:

var s *someStruct 
Foo(s) 

然後,我決定將結構轉換爲接口:

func Foo(s someStructInterface) { 
    fmt.Printf("s is %v\n", s) 
    if s!=nil { 
     fmt.Printf("s is not nil") 
     ... 
    } 
} 

這給了我一個奇怪的輸出:

s is null 
s is not nil 

Wh ile我預計會得到s is nil,這是我平時得到的。 Go在這種情況下null和nil有什麼區別,我如何檢查是否有null或nil來正確執行代碼?

+1

[隱藏零值,理解爲什麼golang這裏失敗]的可能的複製(http://stackoverflow.com/questions/29138591/hiding-nil-values-understanding-why-golang-fails-here#29138676)。 – icza

+3

您的界面示例中的輸出是'',而's不是零'。 – peterSO

回答

3

接口值包含一個類型和一個值的引用。在下面的代碼:

var s *someStruct 
Foo(s) 

傳遞給富接口值包含對類型*someStruct和零的參考。

聲明fmt.Printf("s is %v\n", s)輸出s is <nil>因爲以下的: 的%v格式打印使用的類型的默認格式的值。值s包含一個指針類型。指針類型的默認格式是%p%p格式打印零指針爲<nil>

表達s != nil評估爲真,因爲在接口值等於零當且僅當該類型的參考是零。在這種情況下,接口值引用類型*someStruct

+3

我不明白明確的單詞「null」來自哪裏。這根本不是Go的結構。 –

+0

我得到這個區別,並可以擴展然而,解釋Printf'的'的行爲,我不認爲這是回答這個問題,所以我建議對闡述。 – evanmcdonnal

+0

@Not_a_Golfer我想有一個'fmt'特殊情況下'但是有像我說的,MuffinTop應該解釋說,因爲他並沒有真正回答這個問題不亞於點出關於接口的一些細節的接口類型%v' 。 – evanmcdonnal