golang字符串排序:数字优先,英文其次,中文按照拼音排序

发布于:2024-04-07 ⋅ 阅读:(156) ⋅ 点赞:(0)

目的:数字优先,英文其次,中文按照拼音排序

思路:将字符串转为统一的编码格式(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
}

网站公告

今日签到

点亮在社区的每一天
去签到