猿问

预期切片但得到接口

我正在使用 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


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


白板的微信
浏览 63回答 1
1回答

慕妹3146593

在里面FindAll(),model参数是interface{}类型。你传递一个值[]Album给它。它已经包装了一个切片值。db.Select()还需要接口类型(相同interace{}类型)的参数。你有一个正是这种类型的接口值,只需按原样传递它:err := db.Select(model, "SELECT * FROM "+table)尽管请注意,为了db.Select()能够修改它,它必须是一个指针,所以model应该包装一个指向切片的指针,而不是“只是”一个切片。所以这样调用FindAll():err := database.FindAll(&albums, "album", a.DB)当您在需要接口类型时传递具体类型的值时,它将被包装在接口值中。传递接口值时,如果是相同的接口类型,则按原样传递。如果它是不同的接口类型,则存储在其中的具体值将被包装(重新包装)在预期接口类型的接口值中。当您传递 时&model,您传递的是 的值*interface{},一个指向接口类型的指针。那不是一个接口类型,它是一个具体类型,所以这个具体类型在传递时将被包装在一个接口值中。查看相关问题:Golang interface{} type misunderstanding
随时随地看视频慕课网APP

相关分类

Go
我要回答