首頁  >  文章  >  後端開發  >  為什麼傳遞給 Go 介面的 Nil 切片不等於 Nil?

為什麼傳遞給 Go 介面的 Nil 切片不等於 Nil?

Barbara Streisand
Barbara Streisand原創
2024-11-04 01:28:03217瀏覽

Why Does a Nil Slice Passed to an Interface in Go Not Equal Nil?

理解 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn