在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; }
您只能對介面值執行類型斷言。因此,您必須先將 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中文網其他相關文章!