1 回答

TA貢獻1995條經(jīng)驗 獲得超2個贊
當您將X和都約束Y到 時any,您將失去所有接口-實現(xiàn)者關(guān)系。編譯時唯一知道的是X和Y是不同的類型,您不能在函數(shù)體內(nèi)將一個分配給另一個。
使其編譯的一種方法是使用顯式斷言:
func Fill[X, Y any](slice []X) {
for i := range slice {
slice[i] = any(*new(Y)).(X)
}
}
但是,如果Y沒有像您的情況X那樣真正實現(xiàn),就會引起恐慌,因為它是(指針類型)實現(xiàn)的。*sync.Mutexsync.Locker
此外,當Y用指針類型實例化 時,您會丟失有關(guān)基本類型的信息,因此會丟失零值,包括*new(Y),nil因此您實際上并沒有基線改進make(只是類型化的 nils 與 nil 接口)。
你想做的是約束到, like但這是不可能的,因為 1) 類型參數(shù)不能用作約束;和/或 2) 約束不能直接嵌入類型參數(shù)。它還會像上面那樣初始化 nils。YXFill[X any, Y X](slice []X)
更好的解決方案是使用構(gòu)造函數(shù)而不是第二個類型參數(shù):
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()
}
}
- 1 回答
- 0 關(guān)注
- 159 瀏覽
添加回答
舉報