登录
首页 >  Golang >  Go问答

对Golang中的结构体数组根据动态字段名称进行排序的方法

来源:stackoverflow

时间:2024-03-18 10:45:30 326浏览 收藏

在 Go 语言中,对结构体数组进行动态字段名称排序是一项常见任务。通过反射机制,我们可以根据从 UI 中接收的 JSON 标签,获取结构体字段并基于其类型进行排序。本文提供了一种解决方案,使用 `sort.Slice` 函数和反射来按字段的 JSON 标签对结构体切片进行排序,支持整型、字符串和布尔型字段的比较。

问题内容

我想按动态字段对结构体数组进行排序。这是结构

type user struct{
    name string `json:"name"`
    age int     `json:"age"`
    status int  `json:"status "`
    type  string  `json:"type"`
}

这是一个结构体数组

var userarray []user

我必须按给定字段对该数组进行排序,该给定字段可以是用户结构的任何字段。但我将从 ui 接收该排序字段作为 json 标记。就像下面这样

sort := agnutil.getqueryparamstring(, "sort", 0, "name")

我尝试过golang中的排序功能,但是如何动态使用它?

sort.Slice(UserArray , func(i, j int) bool {
        return UserArray[i].  < UserArray[j].
    })

正确答案


我想尝试按字段的 json 标签对结构切片进行排序,我最终得到的是 here,以防它对任何人有帮助:

package main

import (
    "fmt"
    "reflect"
    "sort"
)

func sortby(jsonfield string, arr []num) {
    if len(arr) < 1 {
        return
    }

    // first we find the field based on the json tag
    valuetype := reflect.typeof(arr[0])

    var field reflect.structfield

    for i := 0; i < valuetype.numfield(); i++ {
        field = valuetype.field(i)

        if field.tag.get("json") == jsonfield {
            break
        }
    }

    // then we sort based on the type of the field
    sort.slice(arr, func(i, j int) bool {
        v1 := reflect.valueof(arr[i]).fieldbyname(field.name)
        v2 := reflect.valueof(arr[j]).fieldbyname(field.name)

        switch field.type.name() {
        case "int":
            return int(v1.int()) < int(v2.int())
        case "string":
            return v1.string() < v2.string()
        case "bool":
            return !v1.bool() // return small numbers first
        default:
            return false // return unmodified
        }
    })

    fmt.printf("\nsort by %s:\n", jsonfield)
    prettyprint(arr)
}

func prettyprint(arr []num) {
    for _, v := range arr {
        fmt.printf("%+v\n", v)
    }
}

type num struct {
    id   int    `json:"id"`
    name string `json:"name"`
    big  bool   `json:"big"`
}

func main() {

    userarray := []num{
        {1, "one", false},
        {5, "five", false},
        {40, "fourty", true},
        {9, "nine", false},
        {60, "sixty", true},
    }

    fmt.println("original:")
    prettyprint(userarray)

    sortby("id", userarray[:])
    sortby("name", userarray[:])
    sortby("big", userarray[:])

}
original:
{Id:1   Name:one     Big:false}
{Id:5   Name:five    Big:false}
{Id:40  Name:fourty  Big:true}
{Id:9   Name:nine    Big:false}
{Id:60  Name:sixty   Big:true}

sort by id
{Id:1   Name:one     Big:false}
{Id:5   Name:five    Big:false}
{Id:9   Name:nine    Big:false}
{Id:40  Name:fourty  Big:true}
{Id:60  Name:sixty   Big:true}

sort by name
{Id:5   Name:five    Big:false}
{Id:40  Name:fourty  Big:true}
{Id:9   Name:nine    Big:false}
{Id:1   Name:one     Big:false}
{Id:60  Name:sixty   Big:true}

sort by big
{Id:1   Name:one     Big:false}
{Id:9   Name:nine    Big:false}
{Id:5   Name:five    Big:false}
{Id:40  Name:fourty  Big:true}
{Id:60  Name:sixty   Big:true}

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《对Golang中的结构体数组根据动态字段名称进行排序的方法》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>