1

我对 Go 还是很陌生,正在尝试使用Beego 的缓存。我可以将 []map[string]string 放入缓存中,但不知道如何将值转换回 []map[string]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 转换为一片地图?

4

1 回答 1

2

深入研究代码似乎即使它说 interface{} 它实际上将所有内容压缩到 []byte

https://github.com/ataxie/beego/blob/master/cache/memcache/memcache.go#L77

当它Get把所有东西都转换成string

https://github.com/ataxie/beego/blob/master/cache/memcache/memcache.go#L61

所以你需要自己编组/解组数据结构。

请参阅此示例并将您的调用和错误检查替换为提供的假人:

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)
}
于 2014-12-02T21:04:48.987 回答