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)
}
}
}
- 1 回答
- 0 關(guān)注
- 154 瀏覽
添加回答
舉報(bào)