为了账号安全,请及时绑定邮箱和手机立即绑定

预期切片但得到接口

预期切片但得到接口

Go
白板的微信 2022-10-10 19:20:39
我正在使用 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


查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 62 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号