使用地图或切片进行效果搜索

时间:2018-04-15 19:36:24

标签: arrays go struct maps slice

我有一个名为Users

的结构
type Users struct {
    name string
    job  string
}

搜索功能

func search() (users []Users, err error) {

    users = make([]Users, 0)
    rows, _ := mysql.Query("select name,job from users")

    for rows.Next() {
        var user Users
        rows.Scan(&user.Name, &user.Job)
        users = append(users, user)
    }
    return
}

正如您可能已经注意到我正在使用切片但是由于我必须处理的大量结果我必须处理性能,我听说地图在性能方面更快但我不知道如果包含我的例子? 如果是这种情况,请你通过我的代码建议我写一个地图数组并尝试追加查询结果的每一行。

1 个答案:

答案 0 :(得分:0)

切片/数组是(有序的)项目列表。您可以轻松访问第42项,但是获取名为" foo" 的项目非常昂贵(您需要遍历列表直至找到它)。

地图是键/值存储:通过它键访问一个项目的速度很快,但遍历所有项目的成本高于切片/数组。

问题是:您想对数据做什么? 你想抓住个别物品 - >使用地图 你想使用整个列表 - >使用切片/数组

这是使用您的代码填充地图的(未经测试的)示例,但根据您的使用情况,这可能是一个非常糟糕的解决方案。

如果您正在编写通用搜索功能,请考虑添加一些服务器端过滤器逻辑。没有什么比获取整个数据库表然后在内存中过滤更糟糕了!

func search() (users map[string]Users, err error) {

    users = make(map[string]Users)
    rows, _ := mysql.Query("select name,job from users")

    for rows.Next() {
        var user Users
        rows.Scan(&user.Name, &user.Job)
        users[user.Name] = user
    }
    return
}

另见https://blog.golang.org/go-maps-in-action