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