我正在使用 sqlx 包進(jìn)行數(shù)據(jù)庫查詢。我正在嘗試為SELECT *我的數(shù)據(jù)庫包中的所有模型創(chuàng)建一個全局變量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我不知道如何管理第一個模型參數(shù)以使其適用于任何模型
1 回答

慕妹3146593
TA貢獻(xiàn)1820條經(jīng)驗 獲得超9個贊
在里面FindAll()
,model
參數(shù)是interface{}
類型。你傳遞一個值[]Album
給它。它已經(jīng)包裝了一個切片值。
db.Select()
還需要接口類型(相同interace{}
類型)的參數(shù)。你有一個正是這種類型的接口值,只需按原樣傳遞它:
err := db.Select(model, "SELECT * FROM "+table)
盡管請注意,為了db.Select()
能夠修改它,它必須是一個指針,所以model
應(yīng)該包裝一個指向切片的指針,而不是“只是”一個切片。所以這樣調(diào)用FindAll()
:
err := database.FindAll(&albums, "album", a.DB)
當(dāng)您在需要接口類型時傳遞具體類型的值時,它將被包裝在接口值中。
傳遞接口值時,如果是相同的接口類型,則按原樣傳遞。如果它是不同的接口類型,則存儲在其中的具體值將被包裝(重新包裝)在預(yù)期接口類型的接口值中。
當(dāng)您傳遞 時&model
,您傳遞的是 的值*interface{}
,一個指向接口類型的指針。那不是一個接口類型,它是一個具體類型,所以這個具體類型在傳遞時將被包裝在一個接口值中。
查看相關(guān)問題:Golang interface{} type misunderstanding
- 1 回答
- 0 關(guān)注
- 77 瀏覽
添加回答
舉報
0/150
提交
取消