ymt/utils/sort_struct.go

46 lines
799 B
Go

package utils
import (
"reflect"
"sort"
"unicode"
)
type KeyValue struct {
Key string
Value any
}
func SortStruct(data any) []KeyValue {
v := reflect.ValueOf(data).Elem()
t := v.Type()
var kv []KeyValue
for i := 0; i < v.NumField(); i++ {
field := v.Field(i)
key := ToSnakeCase(t.Field(i).Name)
if field.IsZero() {
continue
}
kv = append(kv, KeyValue{Key: key, Value: field.Interface()})
}
sort.SliceStable(kv, func(i, j int) bool {
return kv[i].Key < kv[j].Key
})
return kv
}
func ToSnakeCase(s string) string {
var result []rune
for i, char := range s {
if unicode.IsUpper(char) {
if i > 0 {
result = append(result, '_')
}
result = append(result, unicode.ToLower(char))
} else {
result = append(result, char)
}
}
return string(result)
}