1 回答

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
- 1 回答
- 0 關(guān)注
- 120 瀏覽
添加回答
舉報(bào)