我需要对来自 3rdparty 包的类型的一部分进行排序。根据某些条件,顺序必须是升序或降序。
我想出的解决方案是:
type fooAscending []foo
func (v fooAscending) Len() int { return len(v) }
func (v fooAscending) Swap(i, j int) { v[i], v[j] = v[j], v[i] }
func (v fooAscending) Less(i, j int) bool { return v[i].Amount < v[j].Amount }
type fooDescending []foo
func (v fooDescending) Len() int { return len(v) }
func (v fooDescending) Swap(i, j int) { v[i], v[j] = v[j], v[i] }
func (v fooDescending) Less(i, j int) bool { return v[i].Amount > v[j].Amount }
if someCondition {
sort.Sort(fooAscending(array))
} else {
sort.Sort(fooDescending(array))
}
有一个更好的方法吗。这个任务有 13 行代码,其中大部分是重复的,似乎有点太多了。
原文由 gsf 发布,翻译遵循 CC BY-SA 4.0 许可协议
从 Go 1.8 开始,有一种更简单的方法可以对切片进行排序,不需要您定义新类型。您只需将匿名函数传递给
sort.Slice
函数。这将按升序排序,如果您想要相反的顺序,只需在匿名函数中写入
a[i] > a[j]
即可。