1 回答

TA貢獻1802條經驗 獲得超5個贊
我找到了一個解決方案,并認為它可能值得分享,以防其他人遇到類似的問題。
最簡單的方法是啟動 DataStore 預期接收的結構切片,然后將指向它的指針作為參數 (interface{}) 傳遞到所需的函數中。DataStore,類似于一些解組函數(我已經嘗試使用 JSON 包)將能夠成功地將數據附加到其中。
嘗試在給定某種類型的情況下在函數內動態創建切片,然后由函數(例如 DataStore 客戶端)接受該切片可能會非常困難(我還沒有找到一種方法來做到這一點)。同樣,傳遞一部分接口(以允許輕松迭代)只會使事情變得復雜。
其次,為了迭代數據(例如將其存儲在緩存中),有必要:(1)檢索接口的底層值(即指針本身) - 這可以使用以下方式實現,(2)取消reflect.ValueOf(pointerInterface)引用指針,以便我們獲得對底層可迭代結構切片的訪問權 - 這可以通過調用來完成.Elem(),(3) 使用方法迭代底層切片.Index(i)(range即使底層類型是可迭代的,也不會接受接口)。
當然,添加一些 switch-case 語句可能適合確保捕獲任何錯誤而不是導致運行時恐慌。
因此,以下代碼為上述問題提供了有效的解決方案:
主要內容:
var data []customEntry
c.CacheData("Person",&data)
以及函數本身:
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 關注
- 157 瀏覽
添加回答
舉報