我正在使用 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我不知道如何管理第一个模型参数以使其适用于任何模型
1 回答

慕妹3146593
TA贡献1820条经验 获得超9个赞
在里面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
- 1 回答
- 0 关注
- 62 浏览
添加回答
举报
0/150
提交
取消