有一个接口声明和许多实现它的结构
type DataInterface interface {
Get(string) string
}
type DataA struct {
d map[string]string
}
func (d *DataA) Get(key string) string {
return d.d[key]
}
func (d *DataA) GetId() string {
return d.Get("id")
}
type DataB struct {
d map[string]string
}
func (d *DataB) Get(key string) string {
return d.d[key]
}
func (d *DataB) GetFile() string {
return d.Get("file")
}
type DataC...
还包括DataC,D,E...
我将把这些DataX
结构体示例存储到type DataSlice []DataInterface
现在,如果我想得到DataX
,我可以这样做:
type DataSlice []DataInterface
func (d DataSlice) GetA() []*DataA {
var ret []*DataA
for _, di := range d {
if v, ok := di.(*DataA); ok {
ret = append(ret, v)
}
}
return ret
}
func (d DataSlice) GetB() []*DataB {
var ret []*DataB
for _, di := range d {
if v, ok := di.(*DataB); ok {
ret = append(ret, v)
}
}
return ret
}
func (d DataSlice) GetC() .....
显然这里有很多重复的代码:
var ret []*DataX
for _, di := range d {
if v, ok := di.(*DataX); ok {
ret = append(ret, v)
}
}
我想我可以用泛型来解决这个问题,然后我定义了这个函数:
func GetDataX[T any] (d DataInterface) *T {
return d.(*T)
}
但出现错误:Impossible type assertion: '*T' does not implement 'DataInterface
所以,我想知道这个方法真的不可能吗?还是可以用另一种方法来完成?
1条答案
按热度按时间xxe27gdn1#
您应该能够使用以下代码处理您的需求:
首先,我简化了代码,只考虑
DataA
和DataB
结构体。然后,我将指针接收器改为值接收器,因为你不打算改变传递给方法的实际示例的状态。多亏了这个改变,GetDataX
工作成功,你能够获得所有类似结构体的信息。让我知道如果这解决了你的问题或者如果你需要其他的东西,谢谢!