package helper import ( "reflect" "sort" "strings" ) func LowercaseFirstLetter(s string) string { if len(s) == 0 { return s } firstLetter := strings.ToLower(s[:1]) return firstLetter + s[1:] } // FieldKeyValue 定义一个结构体用于存储字段名和对应的值 type FieldKeyValue struct { Key string Value interface{} } // SortStructFieldsByKey 按照键名对结构体导出字段进行字典序排序,并返回键值对切片 func SortStructFieldsByKey(s interface{}) []FieldKeyValue { // 获取结构体的反射值 value := reflect.ValueOf(s) // 如果传入的是指针,获取指针指向的值 if value.Kind() == reflect.Ptr { value = value.Elem() } // 检查是否为结构体 if value.Kind() != reflect.Struct { return nil } // 获取结构体的类型 typ := value.Type() // 存储字段名和对应的值 fieldKVs := make([]FieldKeyValue, 0, typ.NumField()) // 遍历结构体的所有字段 for i := 0; i < typ.NumField(); i++ { field := typ.Field(i) // 只处理导出的字段(PkgPath 为空表示导出字段) if field.PkgPath == "" { // 获取字段名 fieldName := field.Name // 获取字段的值 fieldValue := value.Field(i).Interface() // 将字段名和对应的值存储到切片中 fieldKVs = append(fieldKVs, FieldKeyValue{ Key: LowercaseFirstLetter(fieldName), Value: fieldValue, }) } } // 对键值对切片按照键名进行字典序排序 sort.Slice(fieldKVs, func(i, j int) bool { return fieldKVs[i].Key < fieldKVs[j].Key }) return fieldKVs }