sql - 预期 slice 但得到界面

标签 sql go interface slice

我正在使用 sqlx 包进行数据库查询。我正在尝试为数据库包中的所有模型创建全局 SELECT *

func FindAll(model interface{}, table string, db *sqlx.DB) error {
    err := db.Select(&model, "SELECT * FROM "+table)
    if err != nil {
        return fmt.Errorf("FindAll: %v", err)
    }
    return nil
}

我是这样用的

albums := []Album{}
err := database.FindAll(albums, "album", a.DB)

但是我得到了这个错误:expected slice but got interface

我不知道如何管理第一个模型参数以使其适用于任何模型

最佳答案

FindAll() 中,model 参数是 interface{} 类型。您将 []Album 的值传递给它。它已经包装了一个 slice 值。

db.Select() 还需要一个接口(interface)类型的参数(相同的 interace{} 类型)。你有一个正是这种类型的接口(interface)值,只需按原样传递它:

err := db.Select(model, "SELECT * FROM "+table)

虽然注意为了db.Select()能够修改它,它必须是一个指针,所以model应该包装一个指向 slice 的指针,而不是“只是”一片。所以像这样调用 FindAll():

err := database.FindAll(&albums, "album", a.DB)

当需要接口(interface)类型时传递具体类型的值时,它将被包装在接口(interface)值中。

当你传递一个接口(interface)值时,如果它是相同的接口(interface)类型,它将按原样传递。如果它是不同的接口(interface)类型,存储在其中的具体值将被包装(重新包装)在预期接口(interface)类型的接口(interface)值中。

当您传递 &model 时,您传递的是 *interface{} 的值,一个指向接口(interface)类型的指针。这不是接口(interface)类型,它是具体类型,因此这个具体类型在传递时将包装在接口(interface)值中。

参见相关问题:Golang interface{} type misunderstanding

关于sql - 预期 slice 但得到界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69865478/

相关文章:

go - golang规范中有关方法值的部分中的 'non-interface method'是什么意思?

time - 如何在 Go 中获取给定月份的第一个星期一?

c# - LINQ 返回一个接口(interface)?

sql - 聚合函数 - 获取不包含在 GROUP BY 子句中的列

mysql - 如何使用sql查询结果来使用date_add

html - 如果用户已登录则隐藏 HTML 内容

java - 接口(interface)是类吗?

php - 获取ROW的个体ID,并使结果可链接

MySQL 两个节点之间的最短路径

go - 使用带有标量或 slice 的函数