Golang 根据字符串首字符排序,要求顺序:特殊字符 > 数字 > 英文 > 中文按照拼音排序
目的:优先特殊字符,其次数字,然后英文,最后中文按照拼音排序
思路:创建一个用于中文字符排序的比较器 c := collate.New(language.Chinese, collate.Numeric)
代码示例
import (
"sort"
"golang.org/x/text/collate"
"golang.org/x/text/language"
)
// 该接口定义一个获取排序字段的函数
type SortByStringAble interface {
GetStrSortField() string
}
func SortByString[T SortByStringAble](list []T, sortType string) []T {
// 创建一个用于中文字符排序的比较器
c := collate.New(language.Chinese, collate.Numeric)
// 使用 sort.SliceStable 保持稳定排序
sort.SliceStable(list, func(i, j int) bool {
if sortType == "desc" {
return c.CompareString(list[i].GetStrSortField(), list[j].GetStrSortField()) > 0
}
return c.CompareString(list[i].GetStrSortField(), list[j].GetStrSortField()) < 0
})
return list
}
单元测试代码:
package service
import (
"fmt"
"testing"
)
type User struct {
Name string
No int
}
func (u *User) GetStrSortField() string {
return u.Name
}
func TestSortByString(t *testing.T) {
list := []*User{
}
list = append(list, &User{
Name: "a2", No: 4})
list = append(list, &User{
Name: "1", No: 2})
list = append(list, &User{
Name: "中a", No: 8})
list = append(list, &User{
Name: "啊bc", No: 7})
list = append(list, &User{
Name: "阿ab", No: 6})
list = append(list, &User{
Name: "b1", No: 5})
list = append(list, &User{
Name: "2a", No: 3})
list = append(list, &User{
Name: "~!天", No: 1})
fmt.Printf("old list: \n")
for i := 0; i < len(list); i++ {
fmt.Printf("%+v \n", list[i])
}
list = SortByString(list, "asc")
fmt.Printf("new list: \n")
for i := 0; i < len(list); i++ {
fmt.Printf("%+v \n", list[i])
}
}