我正在使用 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
我不知道如何管理第一個模型引數以使其適用于任何模型
uj5u.com熱心網友回復:
在里面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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/352546.html
上一篇:在GO中解組嵌套的JSON物件
