無法將泛型型別參數轉換為特定型別
在Go 中,使用泛型時,了解泛型型別參數與特定類型之間的關係非常重要他們的限制。在這種情況下,問題源自於嘗試將指向泛型類型參數 (*T) 的指標作為參數傳遞給需要特定介面(字串器)的函數。
錯誤訊息解釋了 *T是一個指向類型參數的指針,但它沒有實作 stringer 介面。這是因為 T (FooBar) 和 stringer 介面的約束沒有本質上的聯繫。要解決這個問題,需要在兩者之間建立關係。
解 1:斷言型別安全(不安全)
一種解法是斷言 *T 是使用 any() 的縱梁。這允許您將指標作為參數傳遞,但它會犧牲類型安全性並可能導致運行時恐慌。
func blah[T FooBar]() { t := new(T) do(any(t).(stringer)) }
解決方案2:參數化FooBar(類型安全)
另一個解決方案是用泛型類型T 來參數化FooBar 接口,確保FooBar 的類型參數和你傳遞給的類型參數一致巴拉比賽。這種方法保留了類型安全性,並允許您將指標傳遞給實作 stringer 介面的特定類型。
type FooBar[T foo | bar] interface { *T stringer } func blah[T foo | bar, U FooBar[T]]() { var t T do(U(&t)) }
說明:
此解決方案可讓您傳遞實作 stringer 介面的特定類型的實例,並確保實例化期間的類型安全。
以上是如何在 Go 中安全地將通用類型指標轉換為特定介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!