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
}

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-10 10:58:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-10 10:58:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-10 10:58:04       87 阅读
  4. Python语言-面向对象

    2024-04-10 10:58:04       96 阅读

热门阅读

  1. ES6 => 箭头函数

    2024-04-10 10:58:04       29 阅读
  2. Hermite 多项式

    2024-04-10 10:58:04       26 阅读
  3. 使用UDP完成网络单词查询,利用dict数据库

    2024-04-10 10:58:04       35 阅读
  4. Request 读取窗体变量四种方式

    2024-04-10 10:58:04       39 阅读
  5. 深度学习神经网络模型微调

    2024-04-10 10:58:04       42 阅读
  6. React中如何实现父组件调用子组件的方法

    2024-04-10 10:58:04       34 阅读
  7. Unity之Unity面试题(四)

    2024-04-10 10:58:04       38 阅读
  8. 无人机空气动力学

    2024-04-10 10:58:04       33 阅读
  9. Linux_CentOS学习笔记

    2024-04-10 10:58:04       37 阅读
  10. LeetCode 671. 二叉树中第二小的节点

    2024-04-10 10:58:04       35 阅读
  11. 蓝桥杯备考随手记: 递归

    2024-04-10 10:58:04       39 阅读
  12. 自动化运维(十七)Ansible 之Kubernetes模块

    2024-04-10 10:58:04       40 阅读