我正在使用 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)值中。
关于sql - 预期 slice 但得到界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69865478/