golang字符串排序:数字优先,英文其次,中文按照拼音排序
- 目的:数字优先,英文其次,中文按照拼音排序
- 思路:将字符串转为统一的编码格式(GBK)再排序
- 代码示例
目的:数字优先,英文其次,中文按照拼音排序
思路:将字符串转为统一的编码格式(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
}