第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

預(yù)期切片但得到接口

預(yù)期切片但得到接口

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


查看完整回答
反對 回復(fù) 2022-10-10
  • 1 回答
  • 0 關(guān)注
  • 77 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號