【发布时间】:2015-07-31 22:19:09
【问题描述】:
在 Golang 中有一个问题困扰着我。 假设我有 2 个结构:
type Dog struct {
Name string
Breed string
Age int
}
type Cat struct {
Name string
FavoriteFood string
Age int
}
当我尝试通过Age 对[]*Dog 和[]*Cat 进行排序时,我必须定义2 个不同的排序结构,例如:
type SortCat []*Cat
func (c SortCat) Len() int {//..}
func (c SortCat) Swap(i, j int) {//..}
func (c SortCat) Less(i, j int) bool {//..}
type SortDog []*Dog
func (c SortDog) Len() int {//..}
func (c SortDog) Swap(i, j int) {//..}
func (c SortDog) Less(i, j int) bool {//..}
一个自然的想法是实现一些SortableByAge接口并使用接口函数创建一个Less函数。喜欢:
type SortableByAge interface {
AgeValue() int
}
然后:
type SortAnimal []SortableByAge
func (c SortDog) Less(i, j int) bool {
return c[i].AgeValue() < c[j].AgeValue()
}
但是,根据: http://golang.org/doc/faq#convert_slice_of_interface
dogs := make([]*Dogs, 0 , 1)
//add dogs here
sort.Sort(SortAnimal(dogs))
以上是不可能的。
所以我想知道这种情况下的最佳做法是什么,并且
是否有任何其他技术可以减少对我错过的类似结构一次又一次地实现sort.Interface 的需求?
编辑: 我意识到我的例子很糟糕:(
在现实生活中,这两个结构非常不同,它们之间唯一的共同点是我希望按一个共同的数值对它们进行排序。
一个更好的例子是:
type Laptop {//...}
type Pizza {//...}
这两个结构的唯一共同点是我希望按价格对它们中的一个切片进行排序(啊……不应该在示例中使用Pizza)。
因此,将它们组合到一个公共结构中并不能真正适用于很多情况。 但会考虑去生成。
【问题讨论】:
-
我建议重新实现它,因为它只有三行。
-
既然没有泛型 -> 重新实现
-
(另一件事是如果它们真的相似,也许你真的想要
type Animal { Species, Name string; Age int }。并非所有不同的真实世界类别都必须映射到你的不同类型程序。) -
谢谢@twotwotwo !我认为我的例子很糟糕,在实际项目中,这两个结构在很多方面都不同,我只是希望它们都可以按数字字段排序,我首先想到的是接口,但发现它不支持.所以只要检查一下stackoverflow,以防我错过了什么
标签: go interface coding-style slice