golang字符串排序:数字优先,英文其次,中文按照拼音排序
目的:数字优先,英文其次,中文按照拼音排序
思路:将字符串转为统一的编码格式(GBK)再排序
代码示例
GitHub 完整示例代码
func UTF82GBK(str string) ([]byte, error) {
GB18030 := simplifiedchinese.All[0]
return io.ReadAll(transform.NewReader(bytes.NewReader([]byte(str)), GB18030.NewEncoder()))
}
func GBK2UTF8(str []byte) (string, error) {
GB18030 := simplifiedchinese.All[0]
b, err := io.ReadAll(transform.NewReader(bytes.NewReader(str), GB18030.NewDecoder()))
return string(b), err
}
func SortByReflect[T any](list []T, field string, sortType string) []T {
sort.SliceStable(list, func(i, j int) bool {
// 通过反射获取字段值
v1 := reflect.ValueOf(list[i])
v2 := reflect.ValueOf(list[j])
if v1.Kind() == reflect.Ptr {
v1 = v1.Elem()
v2 = v2.Elem()
}
if v1.Kind() != reflect.Struct {
return false
}
f1 := v1.FieldByName(field)
f2 := v2.FieldByName(field)
switch f1.Kind() {
case reflect.String:
str1, _ := UTF82GBK(f1.String())
str2, _ := UTF82GBK(f2.String())
if sortType == "asc" {
return bytes.Compare(str1, str2) < 0
} else {
return bytes.Compare(str1, str2) > 0
}
case reflect.Struct:
if f1.Type().String() == "time.Time" {
if sortType == "asc" {
return f1.Interface().(time.Time).Before(f2.Interface().(time.Time))
} else {
return f1.Interface().(time.Time).After(f2.Interface().(time.Time))
}
}
}
return false
})
return list
}