将map [string] interface {}数据存储在diskv值字段(expected [] byte)中,用于缓存http请求

问题描述 投票:-1回答:1

我正在尝试编写自己的httpcache;我怀疑我做错了,但这是我的方法:

我的回答如下:

response := make(map[string]interface{})
w.WriteHeader(http.StatusOK)
response["status"] = true
response["token"] = someTokenString
response["data"] = someStructSlice // etc
json.NewEncoder(w).Encode(response)

我现在的计划是使用https://github.com/peterbourgon/diskv,其中我设置密钥等于URL路径(必要时+用户名/令牌)。然后将值等于响应数据。

问题是我不确定应该如何存储这些数据。 dickv期望数据类型为[]byte,而我的响应数据类型为map[string]interface {} ..

在我开始试图弄清楚如何转换它之前,我想我会问这里的专家我是否使用了正确的方法。如果我是,有没有一种简单的方法将response存储在dickv值(类型为[]byte)?

go
1个回答
1
投票

好吧,你已经编码为JSON,它输出为[]字节。你可以存储它。此外,您还可以获得额外的好处,即无需在每次缓存命中时进行解码/编码,只需直接从缓存中提供数据:

if cached, ok := getFromCache(id); ok {
    response.Write(cached)
    return
}
response["status"] = true
response["token"] = someTokenString
response["data"] = someStructSlice // etc
payload, err := json.Marshall(response)
saveToCache(payload, id)
response.Write(payload)

您还可以使用内置的gob package,它更有效,但如果数据模型发生变化则更容易破坏。

© www.soinside.com 2019 - 2024. All rights reserved.