Golang - 缓存返回 base 64 constricted

Golang - Ristretto Cache returning base 64

我在使用 ristretto 缓存时遇到问题。事实上,我有一点 api 应该 return 我在我的 ristretto 缓存中存储一​​个值 json.

问题是当我调用我的函数时,return 是用 base64 编码的 json,我就是找不到解码它的方法。

这是我的代码:

func InitCache() {
    var err error
    ristrettoCache, err = ristretto.NewCache(&ristretto.Config{
        NumCounters: 3000,
        MaxCost: 1e6,
        BufferItems: 64,
    })
    if err != nil {
        panic(err)
    }
}

第 2 部分:将我的值放入缓存:

for _, t := range listTokensFromDB {
    b, err := json.Marshal(t)
    if err != nil {
        fmt.Println(err)
    }
    ristrettoCache.Set(t.Symbol, b, 1)
}

第 3 部分:从缓存中获取值

func getTokenInfo(w http.ResponseWriter, r *http.Request){
    vars := mux.Vars(r)
    key := vars["chain"]+vars["symbol"]
    value, found := ristrettoCache.Get(key)
    if !found {
        return
    }
    json.NewEncoder(w).Encode(value)
}

我打电话给 api 时得到的结果是:

"eyJTeW1ib2wiOiJic2NDUllQVE8iLCJBZGRyIjoiMHgyQmNBMUFlM0U1MjQ0NzMyM0IzRWE0NzA4QTNkMTg1ODRDYWY4NWE3IiwiTHBzIjpbeyJTeW1ib2xUb2tlbiI6IkZFRyIsIlRva2VuQWRkciI6IjB4YWNGQzk1NTg1RDgwQWI2MmY2N0ExNEM1NjZDMWI3YTQ5RmU5MTE2NyIsIkxwQWRkciI6IjB4NDU5ZTJlMjQ4NGNlMDU2MWRmNTJiYzFlNjkxMzkyNDA2M2JhZDM5MCJ9LHsiU3ltYm9sVG9rZW4iOiJmQk5CIiwiVG9rZW5BZGRyIjoiMHg4N2IxQWNjRTZhMTk1OEU1MjIyMzNBNzM3MzEzQzA4NjU1MWE1Yzc2IiwiTHBBZGRyIjoiMHg3OGM2NzkzZGMxMDY1OWZlN2U0YWJhMTQwMmI5M2Y2ODljOGY0YzI3In1dfQ=="

但是我想要base64解码的版本...

如果我在将值 b 插入缓存时将值 b 更改为字符串,如下所示:

for _, t := range listTokensFromDB {
        b, err := json.Marshal(t)
        if err != nil {
            fmt.Println(err)
        }

        ristrettoCache.Set(t.Symbol, string(b), 1)
    }

当我收到回复时,我得到了字符串化的 json,如下所示: "{"Symbol":"bscCRYPTO","Addr":"0x2BcA1Ae3E52447323B..."

而且我找不到摆脱这个字符串的方法:/

有人知道我怎样才能得到真正的json吗?

提前谢谢你,祝你有个愉快的一天!

根据我的评论,我的意思是,在这一行中,value 最有可能是 []byte 类型(或 []uint8 - 这是同一件事)

value, found := ristrettoCache.Get(key)

JSON 编码 []byte 将隐式 base64 输出 - 因为 JSON 是基于文本的。

json.NewEncoder(w).Encode(value) // <- value is of type []byte

检查您发布的 base64 (https://play.golang.org/p/NAVS4qRfDM2),底层二进制字节已经编码为 JSON - 因此不需要额外的 json.Encode

只需在您的处理程序中输出原始字节 - 并将内容类型设置为 application/json:

func getTokenInfo(w http.ResponseWriter, r *http.Request){
    vars := mux.Vars(r)
    key := vars["chain"]+vars["symbol"]
    value, found := ristrettoCache.Get(key)
    if !found {
        return
    }

    // json.NewEncoder(w).Encode(value) // not this

    w.Header().Set("Content-Type", "application/json")

    if bs, ok := value.([]byte); ok {
        _, err := w.Write(bs) //raw bytes (already encoded in JSON)

        // check 'err'
    } else {
        // error unexpected type behind interface{}
    }
}