Go语言如何按sort_order字段对自定义Data结构体数组简便排序
Go 按sort_order排序Data数组的实现方案
核心思路
先从每个Data实例的Sort字段中提取sort_order对应的数值,再基于这个数值对Data数组排序,不用考虑sSortdata是否为全局变量,只要排序逻辑和结构体定义在同一作用域即可正常访问。
代码实现
第一步:编写sort_order提取函数
先实现工具方法从[]sSortdata中提取sort_order的整数值,同时处理异常场景:
import "strconv" // 入参为Data的Sort字段,返回sort_order对应的整数值 // 找不到sort_order、值转整数失败时返回默认值9999,会排在列表最后,可自行调整默认值 func getSortOrder(sorts []sSortdata) int { for _, item := range sorts { if item.Key == "sort_order" { order, err := strconv.Atoi(item.Value) if err != nil { return 9999 } return order } } return 9999 }
第二步:排序Data数组
方案1:Go 1.21及以上版本(推荐,性能更好写法更简洁)
用标准库slices的SortFunc方法实现:
import "slices" // dataList为你要排序的[]Data类型数组 slices.SortFunc(dataList, func(a, b Data) int { orderA := getSortOrder(a.Sort) orderB := getSortOrder(b.Sort) // 升序排序,要降序的话改成 return orderB - orderA return orderA - orderB })
方案2:Go 1.21以下版本
用标准库sort的Slice方法实现:
import "sort" // dataList为你要排序的[]Data类型数组 sort.Slice(dataList, func(i, j int) bool { // 升序排序,要降序的话改成 > return getSortOrder(dataList[i].Sort) < getSortOrder(dataList[j].Sort) })
注意事项
- 如果需要在sort_order相同的时候补充其他排序规则,直接在排序的回调函数里加判断逻辑即可
- 找不到sort_order或者值格式错误的默认排序优先级可以自行调整,比如要让无效值排在最前面,把默认返回值改成-1即可
内容的提问来源于stack exchange,提问作者Kavindu Yasintha Silva
相关产品推荐
相关产品推荐

