第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

同時具有接口和實現(xiàn)的 Golang 泛型

同時具有接口和實現(xiàn)的 Golang 泛型

Go
富國滬深 2022-11-23 19:28:53
我正在嘗試編寫以下函數(shù):func Fill[X any](slice []*X){   for i := range slice {      slice[i] = new(X)   }}xs := make([]*int, 10) // fill with nilsFill(xs) // now fill with new(int)這很好用,但是……如果我想使用一部分接口并提供具體類型?func Fill[X, Y any](slice []X){   for i := range slice {      slice[i] = new(Y) // not work!   }}xs := make([]sync.Locker, 10) // fill with nilsFill[sync.Locker,sync.Mutex](xs) // ouch我嘗試了一些組合沒有成功,有沒有辦法或者go1.18不支持這樣的關(guān)系?
查看完整描述

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

    }

}


查看完整回答
反對 回復 2022-11-23
  • 1 回答
  • 0 關(guān)注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號