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中文網其他相關文章!