首頁  >  文章  >  後端開發  >  為什麼 Go 中自訂類型類型斷言失敗,但轉換成功?

為什麼 Go 中自訂類型類型斷言失敗,但轉換成功?

Linda Hamilton
Linda Hamilton原創
2024-11-04 07:14:02633瀏覽

Why Does Type Assertion Fail with Custom Types in Go, But Conversion Succeeds?

Go 中的命名類型斷言和轉換

在Go 中,命名類型斷言和轉換允許開發人員操作自訂和預定義的資料型態。但是,在處理重新定義預定義類型的自訂類型時,可能會出現誤解。讓我們詳細探討這個問題。

考慮以下程式碼範例:

<code class="go">type Answer string

func acceptMe(str string) {
    fmt.Println(str)
}

func main() {
    type Answer string
    var ans Answer = "hello"

    // Illegal usage
    acceptMe(ans)

    // Failed type assertion
    acceptMe(ans.(string))

    // Works (but why?)
    acceptMe(string(ans))
}</code>

問:為什麼型別斷言 (ans.(string)) 失敗,而轉換(string(ans)) 有效嗎?

A: 類型斷言只適用於介面類型,它表示值可以滿足的契約。由於像 Answer 這樣的自訂類型不是接口,因此嘗試使用類型斷言語法來斷言它們將導致錯誤。

相反,轉換明確地將一種類型轉換為另一種類型。轉換 (string(ans)) 成功,因為 Answer 具有基礎字串類型。 Go 會在將 Ans 傳遞給 AcceptMe 之前將其隱式轉換為其底層字串。

附加說明:

  • 像 Answer 這樣的自訂類型本質上是現有類型的別名。它們不會添加新的功能或行為。
  • 型別斷言提供執行時間類型檢查,而轉換則執行隱式型別強制。
  • 在處理包裝預定義類型的自訂類型時,通常建議使用轉換而不是類型斷言,因為它們更有效,並且如果基礎類型匹配則總是成功。

以上是為什麼 Go 中自訂類型類型斷言失敗,但轉換成功?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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