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

时间:2018-03-02 06:26:23

标签: go

我有两个结构(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中解决这些问题的正确模式是什么。

1 个答案:

答案 0 :(得分: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{}}