亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

同時具有接口和實現的 Golang 泛型

同時具有接口和實現的 Golang 泛型

Go
富國滬深 2022-11-23 19:28:53
我正在嘗試編寫以下函數: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不支持這樣的關系?
查看完整描述

1 回答

?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

當您將X和都約束Y到 時any,您將失去所有接口-實現者關系。編譯時唯一知道的是X和Y是不同的類型,您不能在函數體內將一個分配給另一個。


使其編譯的一種方法是使用顯式斷言:


func Fill[X, Y any](slice []X) {

    for i := range slice {

        slice[i] = any(*new(Y)).(X)

    }

}

但是,如果Y沒有像您的情況X那樣真正實現,就會引起恐慌,因為它是(指針類型)實現的。*sync.Mutexsync.Locker


此外,當Y用指針類型實例化 時,您會丟失有關基本類型的信息,因此會丟失零值,包括*new(Y),nil因此您實際上并沒有基線改進make(只是類型化的 nils 與 nil 接口)。


你想做的是約束到, like但這是不可能的,因為 1) 類型參數不能用作約束;和/或 2) 約束不能直接嵌入類型參數。它還會像上面那樣初始化 nils。YXFill[X any, Y X](slice []X)


更好的解決方案是使用構造函數而不是第二個類型參數:


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 關注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號