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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

清空接口類(lèi)型斷言并創(chuàng)建副本

清空接口類(lèi)型斷言并創(chuàng)建副本

Go
元芳怎么了 2023-07-10 09:26:00
無(wú)法弄清楚如何修改作為指針傳遞給接受空接口的函數(shù)的結(jié)構(gòu)類(lèi)型變量我正在創(chuàng)建一種通過(guò)官方 go 驅(qū)動(dòng)程序與 MongoDB 數(shù)據(jù)庫(kù)配合使用的庫(kù)。我傳遞一個(gè)結(jié)構(gòu)指針,然后用數(shù)據(jù)庫(kù)(MongoDB)中的數(shù)據(jù)填充該指針cursor.Decode。這對(duì)于單個(gè)文檔來(lái)說(shuō)效果很好,但是當(dāng)我嘗試返回文檔數(shù)組時(shí),只有父文檔是正確的,但子文檔(嵌入的)對(duì)于數(shù)組中的所有元素保持不變(可能存儲(chǔ)引用而不是實(shí)際值)。實(shí)際代碼:// passing model pointer to search functionresult, _ := mongodb.Search(&store.Time{},                 mongodb.D{mongodb.E("transdate",                     mongodb.D{mongodb.E("$gte", timeSearch.DateFrom), mongodb.E("$lte", timeSearch.DateTo)})})...func Search(model interface{}, filter interface{}) (result ModelCollection, err error) {    collection := Database.Collection(resolveCollectionName(model))    var cursor *mongo.Cursor    cursor, err = collection.Find(Context, filter)    if err != nil {        log.Fatal(err)    }     for cursor.Next(Context) {        if err := cursor.Decode(model); err != nil {            log.Fatal(err)        }        modelDeref := reflect.ValueOf(model).Elem().Interface()        result = append(result, modelDeref)    }    return}這是我能想到的最接近的游樂(lè)場(chǎng)示例。我cursor.Decode()用自己的 Decoding 函數(shù)替換了 MongoDB,但這甚至沒(méi)有更新父屬性。孩子們還是一樣https://play.golang.org/p/lswJJY0yl80預(yù)期的:結(jié)果:[{A:1 子級(jí):[{B:11}]} {A:2 子級(jí):[{B:22}]}]實(shí)際的:結(jié)果:[{A:init 子級(jí):[{B:22}]} {A:init 子級(jí):[{B:22}]}]
查看完整描述

1 回答

?
ITMISS

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊

您正在解碼為同一個(gè)指針,因此您總是會(huì)得到一個(gè)切片,其中包含的元素的值與您上次解碼的元素的值相同。


相反,您應(yīng)該在每次迭代中初始化模型類(lèi)型的新實(shí)例,然后解碼為該實(shí)例。


result, _ := mongodb.Search(store.Time{}, ...) // pass in non-pointer type to make life easier


// ...


func Search(model interface{}, filter interface{}) (result ModelCollection, err error) {

    collection := Database.Collection(resolveCollectionName(model))


    var cursor *mongo.Cursor

    cursor, err = collection.Find(Context, filter)

    if err != nil {

        log.Fatal(err)

    } 


    for cursor.Next(Context) {

        v := reflect.New(reflect.TypeOf(model)).Interface() // get a new pointer instance

        if err := cursor.Decode(v); err != nil { // decode

            log.Fatal(err)

        }


        md := reflect.ValueOf(v).Elem().Interface()

        result = append(result, md) // append non-pointer value

    }


    return

}


查看完整回答
反對(duì) 回復(fù) 2023-07-10
  • 1 回答
  • 0 關(guān)注
  • 137 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號(hào)

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