gpt4 book ai didi

sql - 预期 slice 但得到界面

转载 作者:行者123 更新时间:2023-12-04 14:46:52 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com