首頁 > 後端開發 > Golang > 為什麼滿足錯誤介面的結構體的 nil 實例比較不等於 nil?

為什麼滿足錯誤介面的結構體的 nil 實例比較不等於 nil?

Susan Sarandon
發布: 2024-10-31 07:50:30
原創
954 人瀏覽過

Why does a nil instance of a struct that satisfies the error interface not compare equal to nil?

Nil Nil 介面比較難題

儘管滿足錯誤接口,但具有nil 實例的結構體不會表現出來與預期相比nil.

問題:

為什麼下面的程式碼不輸出「Error is nil」?

<code class="go">type Goof struct {}

func (goof *Goof) Error() string {
    return fmt.Sprintf("I'm a goof")
}

func TestError(err error) {
    if err == nil {
        fmt.Println("Error is nil")
    } else {
        fmt.Println("Error is not nil")
    }
}

func main() {
    var g *Goof // nil
    TestError(g) // expect "Error is not nil"
}</code>
登入後複製

答案:

Go中,介面比較同時考慮型別和值。雖然Goof 類型實現了error 接口,但Goof (*Goof)(nil) 的nil 實例具有與以下不同的類型: error(nil).

解決方案:

要解決此問題,您可以採用以下方法之一:

  • 聲明err 錯誤而不是var g *Goof。這會將 err 初始化為錯誤類型的零值,即 nil
  • 在傳回錯誤的函數中,明確傳回 nil 而不是隱式回傳。

更多詳情請參閱擴充回覆下方:

擴充回應:

介面值由兩個元件組成:型別和動態值。 nil 介面值同時包含 nil 類型和 nil 值。在我們的例子中, (*Goof)(nil) 具有非 nil 類型 (Goof),但具有 nil 值。

此外,Go 的相等運算子 (==) 嚴格檢查類型標識。因此,將 (*Goof)(nil) 與 error(nil) 進行比較會失敗,因為它們的類型不同。

此行為與 Go 中的其他類型檢查一致。例如,在下面的程式碼中,底層資料相同(3),但變數類型不同,導致介面儲存時不相等:

<code class="go">var x int = 3
var y Bob = 3
var ix, iy interface{} = x, y
fmt.Println(ix == iy) // false</code>
登入後複製

以上是為什麼滿足錯誤介面的結構體的 nil 實例比較不等於 nil?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板