首頁  >  文章  >  後端開發  >  Go 中自訂類型的型別斷言和轉換有什麼不同?

Go 中自訂類型的型別斷言和轉換有什麼不同?

DDD
DDD原創
2024-11-06 10:32:02842瀏覽

What's the Difference Between Type Assertions and Conversions for Custom Types in Go?

了解Go 中命名類型斷言和轉換之間的差異

在Go 中使用自訂類型時,了解命名類型斷言和轉換之間的細微差別至關重要。讓我們透過一個範例來探討這個概念。

考慮下面的程式碼片段,其中我們定義了一個自訂類型Answer,它重新定義了預先定義的字串類型:

<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"

    // Assertion fails: cannot use ans (type Answer) as type string in function argument
    acceptMe(ans)

    // Type assertion fails as well: invalid type assertion: ans.(string) (non-interface type Answer on left)
    acceptMe(ans.(string))

    // Conversion succeeds.
    acceptMe(string(ans))
}</code>

為什麼斷言失敗?

型別斷言僅適用於介面。介面允許底層類型發生變化。為了確定實際類型,Go 使用類型斷言 (x.(T)) 或類型開關 (switch x := x.(type))。斷言傳回布林值,指示斷言是否成功。

在我們的例子中,Answer 是一個具有固定基礎類型(字串)的命名類型。由於底層類型是已知的,因此不需要斷言。使用 string(ans) 將 Answer 類型轉換為字串就足夠了。

以上是Go 中自訂類型的型別斷言和轉換有什麼不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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