首頁  >  文章  >  後端開發  >  無法對型別參數值使用型別斷言

無法對型別參數值使用型別斷言

PHPz
PHPz轉載
2024-02-09 21:42:09670瀏覽

無法對型別參數值使用型別斷言

在PHP程式設計中,型別斷言是一種常用的技術,用來決定變數的型別。然而,有時候我們可能會遇到一個問題:無法對型別參數值使用型別斷言。這個問題可能會讓一些開發者感到困惑。在本文中,我們將探討這個問題的原因,並提供一些解決方案。無論是初學者還是有經驗的開發者,透過了解和解決這個問題,我們都能夠更好地理解和使用類型斷言。讓我們一起來看看吧!

問題內容

我們不能對泛型類型變數使用型別斷言。考慮到它是 interface{} 允許的,但不受 interface{} 約束的通用行為,這看起來確實很奇怪。想知道是否有任何解決方法?

// This works
func isInt(x interface{}) bool {
    _, ok := x.(int)
    return ok;
}

// Compile Error
// invalid operation: cannot use type assertion on type parameter 
// value x (variable of type T constrained by interface{})
func isInt2[T interface{}](x T) bool {
    _, ok := x.(int)
    return ok;
}

解決方法

tl;博士

您只能對介面值執行類型斷言。因此,您必須先將 x 轉換為有效的介面類型,在本例中為 any / interface{}

func isint[t any](x t) (ok bool) {

    _, ok = any(x).(int) // convert, then assert
    return
}

那為什麼這個編譯失敗

_, ok = x.(int)   // ... cannot use type assertion on type parameter value ...

x 的型別 t 是一個型別參數,而不是一個介面。它僅受接口約束。 go(修訂版 1.18)語言規範明確規定 類型參數 不允許出現在 類型斷言

對於 介面類型但不是類型的表達式 x# 參數,以及型別 t ...符號 x.(t) 稱為型別斷言。

同樣來自泛型教學,了解為什麼參數型別需要在編譯時解析:

雖然類型參數的限制通常表示一組 類型,在編譯時類型參數代表單一類型 – 呼叫代碼作為類型參數提供的類型。如果類型 參數的類型不被類型形參的限制所允許, 程式碼無法編譯。

以上是無法對型別參數值使用型別斷言的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除