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

时间:2018-10-27 17:00:31

标签: sorting go struct

假设我有3个字段A B C的结构sl []SortableStruct,我想实现消耗orderFied stringorderField的函数,其中orderField是struct的字段之一。此函数应重新运行按sort.Interface排序的切片。有没有没有巨大的开关情况下做到这一点的方法。当我想比较不同字段的结构时,如何实现AutoFill()对我来说并不难。

1 个答案:

答案 0 :(得分:0)

最简单的方法是切换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)