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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Golang:如何嵌入具有不同類型參數(shù)的接口?

Golang:如何嵌入具有不同類型參數(shù)的接口?

Go
蠱毒傳說 2023-02-14 17:58:06
代碼給我錯(cuò)誤:DB redeclared。有沒有慣用的方法來解決它?或者任何解決方法?愛type a struct {    DB[int64]    DB[string]}type b interface {    DB[int64]    DB[string]}type DB[T any] interface {    GetList(query string) ([]T, error)}
查看完整描述

1 回答

?
夢(mèng)里花落0921

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個(gè)贊

你不能嵌入相同的接口,即使有不同的類型參數(shù)。不管它是如何實(shí)例化的,您都試圖將b兩個(gè)具有相同名稱GetList 和不同簽名的方法提升到接口中——由DB.


嵌入到結(jié)構(gòu)中的情況類似,盡管在技術(shù)上并不相同。在結(jié)構(gòu)體中,嵌入字段的名稱是類型的名稱—— DB,一個(gè)結(jié)構(gòu)體不能有兩個(gè)同名的非空白字段。


關(guān)于如何解決這個(gè)問題,這取決于你想要完成什么。


如果您想傳達(dá)“使用任一類型參數(shù)a實(shí)現(xiàn)DB”,您可以嵌入DB[T]并使其成為a通用的,并限制a其類型參數(shù):


type a[T int64 | string] struct {

    DB[T]

}


// illustrative implementation of the DB[T] interface

// if you embed DB[T] you likely won't use `a` itself as receiver

func (r *a[T]) GetList(query string) ([]T, error) {

    // also generic method

}


這沒關(guān)系,因?yàn)镈B的類型參數(shù)被限制為any,并且a的類型參數(shù)更具限制性。這允許您在其他泛型方法中使用a,或在實(shí)例化時(shí)選擇特定類型,但 的實(shí)現(xiàn)GetList也必須參數(shù)化。


否則,如果你需要a有返回or的分離方法,你必須給它不同的名字。int64string


最后,您可以將 的實(shí)例嵌入DB到兩個(gè)具有不同名稱的接口中,然后將它們嵌入到ainstead 中。


type a struct {

    DBStr

    DBInt

}


type DBStr interface {

    DB[string]

}


type DBInt interface {

    DB[int64]

}

這樣雖然頂級(jí)選擇器不可用,因?yàn)榉椒Q仍然相同。該程序可以編譯,但您必須明確選擇要在哪個(gè)字段上調(diào)用該方法:


myA := a{ /* init the two fields */ }


res, err = myA.DBStr.GetList(query)

// res is type []string

// or

res, err = myA.DBInt.GetList(query)

// res is type []int64


查看完整回答
反對(duì) 回復(fù) 2023-02-14
  • 1 回答
  • 0 關(guān)注
  • 120 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

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