」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > **在 Go 中使用泛型進行切片初始化時如何保留介面-實作者關係?

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

發佈於2024-11-05
瀏覽:552

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

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

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

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

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

func Fill[X, Y any](slice []X) {
    for i := range slice {
        slice[i] = any(*new(Y)).(X)
    }
}

然而,當 Y 未實作 X 時,此方法會出現恐慌。此外,對 Y 使用指標類型會導致遺失有關基本類型和零基線值的資訊。

To為了解決這些問題,建議使用建構子而不是第二個型別參數:

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

這種方法有效地使用建構子建立的初始化值填充切片,為問題提供了更強大、更靈活的解決方案。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3