首頁  >  文章  >  後端開發  >  為什麼類型斷言失敗但轉換可以在 Go 中使用自訂類型?

為什麼類型斷言失敗但轉換可以在 Go 中使用自訂類型?

Susan Sarandon
Susan Sarandon原創
2024-11-04 08:41:30872瀏覽

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

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

考慮以下場景,其中定義自訂類型來重新定義預定義類型:

<code class="go">type Answer string</code>

現在,讓我們嘗試在接受原始預定義類型的函數中使用此自訂類型:

<code class="go">func acceptMe(str string) {
    fmt.Println(str)
}

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

    // Type assertion fails
    acceptMe(ans.(string)) 
    // Conversion works
    acceptMe(string(ans))
}</code>

類型斷言ans.(string) 失敗並出現錯誤:無效類型斷言:ans.(string)(左側非介面類型Answer)。另一方面,轉換字串(ans)成功。這種行為提出了一個問題:

為什麼類型斷言失敗,但轉換有效?

為了理解這一點,讓我們澄清類型斷言只適用於介面。介面可以具有任意基礎類型,因此類型斷言和類型切換至關重要。類型斷言傳回布林值以及結果,表示斷言成功。

相反,您的自訂類型 Answer 有一個固定的基礎類型,即字串。由於您已經知道確切的類型,因此不需要類型斷言,因為從 Answer 到字串的轉換始終會成功。此轉換的語法是 string(ans).

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

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