首頁 >後端開發 >Golang >**在 Go 中使用泛型進行切片初始化時如何保留介面-實作者關係?

**在 Go 中使用泛型進行切片初始化時如何保留介面-實作者關係?

DDD
DDD原創
2024-10-25 17:22:02567瀏覽

**How to Preserve Interface-Implementor Relationships When Using Generics in Go for Slice Initialization?**

Golang 泛型中的介面/實作同時性

考慮建立泛型函數以初始化值填充切片的任務。雖然這看起來很簡單,但在嘗試利用介面切片並在函數中指定具體類型時會出現挑戰。

在 Go 1.18 中,將 X 和 Y 限制為通用函數 Fill 中的任何類型會導致損失介面與其實作者之間的任何關係。這可以防止將 Y 的實例指派給函數內的 slice[i]。

為了克服這個問題,可以使用明確斷言:

<code class="go">func Fill[X, Y any](slice []X) {
    for i := range slice {
        slice[i] = any(*new(Y)).(X)
    }
}</code>

但是,當 Y 時,此方法會出現恐慌。不實現 X。此外,對 Y 使用指標類型會導致遺失有關基本類型的信息和零基線值。

要解決這些問題,建議使用構造函數而不是第二個類型參數:

<code class="go">func main() {
    xs := make([]sync.Locker, 10)
    Fill(xs, func() sync.Locker { return &sync.Mutex{} })
}

func Fill[X any](slice []X, f func() X) {
    for i := range slice {
        slice[i] = f()
    }
}</code>

這種方法有效地使用構造函數創建的初始化值填充切片,為問題提供了更健壯和靈活的解決方案。

以上是**在 Go 中使用泛型進行切片初始化時如何保留介面-實作者關係?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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