按指定字段对结构切片进行排序



假设我有一个具有3个字段ABC的结构体SortableStruct,我想实现使用sl []SortableStructorderFied string的函数,其中orderField是结构体的字段之一。此函数应重新运行按orderField排序的切片。有没有一种方法可以在没有巨大开关盒的情况下做到这一点。当我想比较不同字段的结构时,我不知道如何实现sort.Interface

最简单的方法是切换field类型并分配SORT函数。这是您的代码:

package main
import (
"fmt"
"sort"
)
type SortableStruct struct {
A int
B int
C int
}
func sortStruct(arr []SortableStruct, field string) {
var less func(i, j int) bool
switch field {
case "B":
less = func(i, j int) bool {
return arr[i].B < arr[j].B
}
case "C":
less = func(i, j int) bool {
return arr[i].C < arr[j].C
}
default:
less = func(i, j int) bool {
return arr[i].A < arr[j].A
}
}
sort.Slice(arr, less)
}
func main() {
arr := []SortableStruct{
{
A: 1,
B: 5,
C: 3,
},
{
A: 2,
B: 3,
C: 20,
},
{
A: -1,
B: -1,
C: 10,
},
}
sortStruct(arr, "C")
fmt.Println(arr)
}

另一个想法是有3个定义的类型,每个类型都实现接口sort.Interface

type SortableStructByA []SortableStruct
type SortableStructByB []SortableStruct
type SortableStructByC []SortableStruct

然后,您必须将切片转换为所需的类型(取决于您想要的排序(,然后执行以下操作:

sortableSlice := SortableStructByA(arr)
sort.Sort(sortableSlice)

最新更新