2014-01-30 40 views

回答

11

不可否認,這有些古怪,但有一個解釋。

想象一下interface{}變量作爲由兩個字段組成的結構體:一個是類型,另一個是數據。 ([]intnil)。實際上,它就像Go運行時一樣。

struct Iface                             
{                                
    Itab* tab;                            
    void* data;                            
}; 

當你通過零切片yes,只有nil作爲價值傳遞,讓你的比較歸結爲nil == nil

同時,調用no會自動將您的變量包裝在interface{}類型中,並且調用變得類似於no(interface{[]int, nil})。因此,在no的比較可以被看作是interface{[]int, nil} == nil,這原來是爲假。

這個問題實際上是在the Go FAQ中解釋的。

+0

Gotcha。感謝您的澄清 - 我應該去看文檔。因此,在這種情況下,零檢查必須是這樣的:http://play.golang.org/p/M_z1I5iGeW – mdwhatcott

+0

http://research.swtch.com/interfaces提供了更多的細節,如果你有興趣。 – alex

+1

TXG golang ......大量使用的接口寫程序是一場噩夢 – let4be