我有两个结构(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中解决这些问题的正确模式是什么。
答案 0 :(得分:1)
定义一个接口,让它由公共类型Attribute
实现。
这样的事情:
type Attributer interface {
GetId() *int
}
func (a Attribute) GetId() *int {
return a.Id
}
func sortItems(items []Attributer) {
//Sort here
}
凭借嵌入 Attribute
类型,Dimension
和Metric
都可用于预期Attributer
接口的任何位置。
所以这将编译得很好。
items := []Attributer{Dimension{}, Metric{}}