首頁  >  文章  >  後端開發  >  為什麼將 nil 切片與 interface{} 進行比較會產生與直接將 nil 切片與 nil 進行比較會產生不同的結果?

為什麼將 nil 切片與 interface{} 進行比較會產生與直接將 nil 切片與 nil 進行比較會產生不同的結果?

Barbara Streisand
Barbara Streisand原創
2024-11-05 05:59:02586瀏覽

Why does comparing a nil slice to an interface{} result in a different outcome than directly comparing a nil slice to nil?

將Nil Slice 傳遞給Interface:解開謎團

在Go 中,nil slice 與nil interface} 值之間的差異可以導致意想不到的結果。考慮以下游樂場摘錄:

<code class="go">package main

import "fmt"

func main() {
    var i []int = nil
    yes(i) // true
    no(i)  // false
}

func yes(thing []int) {
    fmt.Println(thing == nil)
}

func no(thing interface{}) {
    fmt.Println(thing == nil)
}</code>

為什麼這些函數會產生不同的輸出?

理解介面{}

介面{}變數類似於具有兩個欄位的結構:類型和資料。在這種情況下,它看起來像 {[]int (type), nil (data)}。

Nil Slice 與 Nil Interface

是的,nil slice 直接傳遞。比較檢查 nil 是否等於 nil,其計算結果為 true。

在 no 中,nil 切片被包裝在介面{}中,結果是 {[]int (type), nil (data)}。將此介面與 nil 進行比較,檢查類型是否為 nil,但事實並非如此。因此,輸出為 false。

差異的原因

此行為源自於介面封裝類型和值的事實。將介面與 nil 進行比較會檢查 nil 類型,而比較基礎資料值則不同。在 no 的情況下,類型不為 nil,因此比較傳回 false。

結論

看似矛盾的行為是由於 nil 切片之間的細微差異造成的和零介面。理解這種差異對於避免在 Go 中使用介面時出現混淆至關重要。

以上是為什麼將 nil 切片與 interface{} 進行比較會產生與直接將 nil 切片與 nil 進行比較會產生不同的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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