我使用 Go 和 MySQL 数据库。假设我有一段这样的字符串:[]string{"b", "c", "a"}并且我想要这样的最终数据:[]Student{ Student{ID: "b", Name: "Ben"}, Student{ID: "c", Name: "Carl"}, Student{ID: "a", Name: "Alexander"},}当我想建立 MySQL 查询时,是使用ORDER BY FIELD(id,'b','c','a')一种高效的方式吗?或者如果我不使用它,我会有这样的代码:keys := []string{"b", "c", "a"}...students := make([]Student, 0)for rows.Next() { s := Student{} err := rows.Scan(&s.ID, &s.Name) if err != nil { log.Fatal(err) } students = append(students, s)}mStudents := make(map[string]Student, 0)for _, v := range students { mStudents[v.ID] = v}finalData := make([]Student, 0)for _, v := range keys { if _, ok := mStudents[v]; ok { finalData = append(finalData, mStudents[v]) }}但我认为这是一种非常低效的方式。那么,还有其他方法吗?
1 回答
慕尼黑8549860
TA贡献1818条经验 获得超11个赞
使用 MySQLORDER BY FIELD(id,'b','c','a')是高效的,如果您不介意扩展查询并在查询中包含您的逻辑,那么它没有任何问题。
如果你想在 Go 中这样做:Go 的标准库提供了一个sort.Slice()对任何切片进行排序的函数。您必须向它传递一个less()函数,该函数必须告诉切片中的 2 个元素如何相互关联,如果一个小于另一个。
你想要一个由另一个排序的keys切片指定的顺序。因此,基本上要判断一个学生是否比另一个学生“少”,您需要比较他们的键的索引。
为了避免每次都对键切片进行线性搜索,您应该构建它们的映射:
m := map[string]int{}
for i, k := range keys {
m[k] = i
}
因此,作为“less”逻辑基础的索引是一个简单的地图查找:
sort.Slice(students, func(i, j int) bool {
return m[students[i].ID] < m[students[j].ID]
})
在Go Playground上试试这个。
- 1 回答
- 0 关注
- 92 浏览
添加回答
举报
0/150
提交
取消