假设我们有一个相当复杂struct的领域,我需要根据不同的标准在几个地方进行排序,例如
type MySuperType struct {
x0, x1, x2, x3 xType
// possibly even more fields
}
// sort 1: ascending x0, then descending x1, then more stuff
// sort 2: if x4==0 then applyCriteria2a else applyCriteria2b
func f1(mySuperSlice []MySuperType) {
// sort 'myList' according sort #1
// do something with the sorted list
}
func f2(mySuperSlice []MySuperType) {
// sort 'myList' according sort #2
// do something with the sorted list
}
func f3(mySuperSlice []MySuperType) {
// sort 'myList' according sort #1, note: we use sort #1 again!
// do something with the sorted list
}
建议的解决方案 1:
创建一个新类型(别名[]MySuperType)来实现sort.Interface所需的每个排序标准。
问题:(i)有一些重复的代码,因为函数Len和Swap将是相同的(ii)将会有一堆新的类型,它们对程序的整体可读性没有帮助——这些新类型并不真正代表任何东西,而且唯一真正重要的是函数Less。
建议的解决方案 2:
使用sort.Slice
这将是完美的解决方案(请参阅此答案),但据我了解,必须内联指定排序功能(invalid receiver type []T ([]T is an unnamed type)当我尝试在其他地方定义它时出现错误,这意味着我需要定义的别名[]T,我们回到解决方案 1)。
现在,定义内联函数的问题是(i)考虑到 的复杂性MySuperType,函数可能会很长,并且(ii)函数将在几个地方重复(例如f1在f3我上面的例子中)——比解决方案 1 更烦人的是排序函数可能又长又复杂。
注意:(i) 如果我们实际上没有 (ii) 就不会是那么大的问题
问题:
鉴于我目前对 Go 的理解和知识,我会使用解决方案 1。
但是有没有人知道可以优雅地解决这个问题的不同方法或改进上面列出的缺点的建议?
慕村9548890
慕斯709654
慕运维8079593
相关分类