如何处理将另一种类型封装为参数的结构片

问题描述 投票:0回答:1

我有两个结构(Dimension和Metric),它们的部分属性重叠,所以我决定使用一个随后封装的公共结构。

type Attribute struct {
    Function *string
    Id *string
}

type Dimension struct {
    Attribute
    Class *string
}

type Metric struct {
    Alias *string
    Attribute
}

我想要的是有一个函数,它接受一个Dimensions或一片Metrics,然后通过id字段对它进行排序,这在两者之间很常见。

dimensions := []Dimension{...}
metrics := []Metric{...}
sortById(dimensions)
sortById(metrics)

我可以使用一些接口类型func sortItems(items []interface{}),但我宁愿避免这样,所以我想知道我怎么能做类似下面的行。

func sortItems(items []Attribute) {
    //Sort here
}

如果我试试这个,我得到cannot use metrics (type []Metric) as type []Attribute in argument to this.sortItems这是预期的,但我是新的足够去不知道如何处理这个。

我知道我可以创建两个函数(每种类型一个),但我很好奇在Go中解决这些问题的正确模式是什么。

go
1个回答
1
投票

定义一个接口,让它由公共类型Attribute实现。

像这样的东西:

type Attributer interface {
    GetId() *int
}

func (a Attribute) GetId() *int {
    return a.Id
}

func sortItems(items []Attributer) {
    //Sort here
}

由于嵌入了Attribute类型,DimensionMetric都可用于预期Attributer界面的任何地方。

所以这将编译得很好。

items := []Attributer{Dimension{}, Metric{}}
© www.soinside.com 2019 - 2024. All rights reserved.