Сортировать структурный фрагмент по указанному полю - PullRequest
0 голосов
/ 27 октября 2018

Допустим, у меня есть структура SortableStruct с 3 полями A B C Я хочу реализовать функцию, которая потребляет sl []SortableStruct и orderFied string, где orderField является одним из полей структуры. Эта функция должна повторять срез, отсортированный по orderField. Есть ли способ сделать это без огромного случая переключения. Мне не очевидно, как реализовать sort.Interface, когда я хочу сравнить структуры по разным полям.

1 Ответ

0 голосов
/ 27 октября 2018

Ну, самый простой способ - переключить тип 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...