首頁 >後端開發 >Golang >如何在 Go 中安全地將通用類型指標轉換為特定介面?

如何在 Go 中安全地將通用類型指標轉換為特定介面?

Barbara Streisand
Barbara Streisand原創
2024-12-11 16:57:22554瀏覽

How to Safely Convert a Generic Type Pointer to a Specific Interface in Go?

無法將泛型型別參數轉換為特定型別

在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))
}

說明:

  • T 的限制現在是 foo 或 bar,而 FooBar 使用 T 進行參數化。
  • 您可以建立指向特定類型的指標(例如,*foo)並將其傳遞給 blah,這將使用對應的類型實例化 FooBar。
  • 轉換 U(&t) 現在有效,因為 U 和指向 T 的指標具有相同的型別集。

此解決方案可讓您傳遞實作 stringer 介面的特定類型的實例,並確保實例化期間的類型安全。

以上是如何在 Go 中安全地將通用類型指標轉換為特定介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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