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