理解 Go 介面中的 nil 切片悖論
當 nil 切片作為介面傳遞時,為什麼結果不是 nil?這種令人困惑的行為可以透過理解 Go 介面的底層實作來解釋。
在Go 中,interface{} 變數本質上是一個雙字段結構,由類型描述符和資料值組成,如下所示iface struct:
struct Iface { Itab* tab; void* data; };
現在,我們來分析提供的兩個函數呼叫程式碼:
<code class="go">yes([]int{}) // output: true no([]int{}) // output: false</code>
yes 函數:
在yes 函數中,[]int{} 值作為參數thing 傳遞。由於 yes 只接受切片參數,因此編譯器將 nil 視為零值切片。因此,比較 thing == nil 變成 nil == nil,傳回 true。
no Function:
相反,no 函數需要一個介面{}範圍。當您傳遞 []int{} 值時,Go 會自動將其包裝在 interface{} 類型中。有效地將其轉換為interface{[]int, nil}。比較 thing == nil 現在計算為 interface{[]int, nil} == nil,結果為 false。
Go FAQ 中進一步闡明了這種行為,其中解釋了「包含nil 的介面僅是如果它們的所有成員都是nil,則等於nil」(即在本例中,[]int(類型成員)不能是nil)。
因此,在處理介面中的 nil 切片時,了解這種怪癖並考慮底層實作以正確解釋行為至關重要。
以上是為什麼傳遞給 Go 介面的 Nil 切片不等於 Nil?的詳細內容。更多資訊請關注PHP中文網其他相關文章!