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

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

如何對自定義類型的切片進(jìn)行范圍調(diào)整

如何對自定義類型的切片進(jìn)行范圍調(diào)整

Go
UYOU 2023-08-14 15:02:01
我正在嘗試為 Google DataStore 編寫 Go 自定義緩存(更準(zhǔn)確地說 - 現(xiàn)有緩存庫之一的包裝器)。在緩存初始化時,它應(yīng)該接受任何自定義類型的結(jié)構(gòu)(具有適當(dāng)定義的數(shù)據(jù)存儲字段),這將是所有存儲項(xiàng)目的基礎(chǔ)。這個想法是可以為各種類型創(chuàng)建/初始化緩存,這些類型反映了特定數(shù)據(jù)存儲條目(CustomEntry)的結(jié)構(gòu)方法 1 - 存儲Reflect.Type并使用它。遇到問題- 無法迭代自定義類型的切片type CustomEntry struct {    Data struct {        name          string   `datastore:"name,noindex"`        address       []string `datastore:"address,noindex"`    } `datastore:"data,noindex"`}func (cache *MyCache) CacheData(dataQuery string, dataType reflect.Type) {    slice := reflect.MakeSlice(reflect.SliceOf(dataType), 10, 10)    if keys, err := DataStoreClient.GetAll(cache.ctx, datastore.NewQuery(dataQuery), &slice); err != nil {        //handle error    } else {        for i, dataEntry:= range slice {        // ERROR: Cannot range over 'slice' (type Value)            cache.Set(keys[i].Name, dataEntry)        }}//usage: Cache.CacheData("Person", reflect.TypeOf(CustomEntry{})方法 2 - 接受接口數(shù)組作為參數(shù)。遇到的問題= []CustomEntry不是[]interface{}func (cache *MyCache) CacheData(dataQuery string, dataType []interface{}) {    if keys, err := DataStoreClient.GetAll(cache.ctx, datastore.NewQuery(dataQuery), &dataType); err != nil {        //handle error    } else {        for i, dataEntry:= range slice {        // this seems to work fine            cache.Set(keys[i].Name, dataEntry)        }}//usage: var dataType []CustomEntryCache.CacheData("Person", data)// ERROR: Cannot use 'data' (type []CustomEntry) as type []interface{}任何建議將不勝感激。
查看完整描述

1 回答

?
慕后森

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個贊

我找到了一個解決方案,并認(rèn)為它可能值得分享,以防其他人遇到類似的問題。


最簡單的方法是啟動 DataStore 預(yù)期接收的結(jié)構(gòu)切片,然后將指向它的指針作為參數(shù) (interface{}) 傳遞到所需的函數(shù)中。DataStore,類似于一些解組函數(shù)(我已經(jīng)嘗試使用 JSON 包)將能夠成功地將數(shù)據(jù)附加到其中。


嘗試在給定某種類型的情況下在函數(shù)內(nèi)動態(tài)創(chuàng)建切片,然后由函數(shù)(例如 DataStore 客戶端)接受該切片可能會非常困難(我還沒有找到一種方法來做到這一點(diǎn))。同樣,傳遞一部分接口(以允許輕松迭代)只會使事情變得復(fù)雜。


其次,為了迭代數(shù)據(jù)(例如將其存儲在緩存中),有必要:(1)檢索接口的底層值(即指針本身) - 這可以使用以下方式實(shí)現(xiàn),(2)取消reflect.ValueOf(pointerInterface)引用指針,以便我們獲得對底層可迭代結(jié)構(gòu)切片的訪問權(quán) - 這可以通過調(diào)用來完成.Elem(),(3) 使用方法迭代底層切片.Index(i)(range即使底層類型是可迭代的,也不會接受接口)。


當(dāng)然,添加一些 switch-case 語句可能適合確保捕獲任何錯誤而不是導(dǎo)致運(yùn)行時恐慌。


因此,以下代碼為上述問題提供了有效的解決方案:


主要內(nèi)容:


var data []customEntry

c.CacheData("Person",&data)

以及函數(shù)本身:


func (cache *MyCache) CacheData(dataQuery string, data interface{}) error {

    if keys, err := DataStoreClient.GetAll(cache.ctx, datastore.NewQuery(dataQuery), data); err != nil {

        return err

    } else {

        s := reflect.ValueOf(data).Elem()

        for i := 0; i < s.Len(); i++ {

            cache.Set(keys[i].Name, s.Index(i), 1)

        }

    }

}


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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