我还是Go的新手并试图使用Beego's cache。我可以将[] map [string]字符串放入缓存中,但无法弄清楚如何将值转换回[] map [string]字符串。
例如,将项目放在缓存中:
m:=make([]map[string]string)
// add items to the slice of maps
.......
// cache it
if err := c.Put("key", m, 100); err != nil {
fmt.Println(err)
}
// retrieve it
n := c.Get("key")
fmt.Println(reflect.TypeOf(n)) // ==>string
// failed attempt
a := n.([]map[string]string)
fmt.Println(a) // panic: interface conversion: interface is string, not []map[string]string
如何将n转换为一片地图?
答案 0 :(得分:2)
很好地挖掘代码似乎即使它说接口{}它实际上它将所有内容压缩到[] byte
https://github.com/astaxie/beego/blob/master/cache/memcache/memcache.go#L77
以及何时Get
将所有内容转换为string
https://github.com/astaxie/beego/blob/master/cache/memcache/memcache.go#L61
所以你需要自己对数据结构进行Marshal / Unmarshal。
请参阅此示例,并使用提供的假人替换您的电话和错误检查:
http://play.golang.org/p/9z3KcOlgAx
package main
import (
"bytes"
"encoding/json"
"log"
)
var cache map[string]string = make(map[string]string)
func Put(key, value string) {
cache[key] = value
}
func Get(key string) string {
return cache[key]
}
func main() {
m := map[string]string{
"A": "1",
"B": "2",
}
if b, err := json.Marshal(m); err != nil {
log.Fatal(err)
} else {
Put("myKey", string(b))
}
b := bytes.NewBufferString(Get("myKey"))
var mm map[string]string
if err := json.Unmarshal(b.Bytes(), &mm); err != nil {
log.Fatal(err)
}
log.Printf("%#v", mm)
}