为了账号安全,请及时绑定邮箱和手机立即绑定

Golang - Ristretto Cache 返回 base 64

Golang - Ristretto Cache 返回 base 64

慕丝7291255 2022-10-10 20:00:26
我在使用 ristretto 缓存时遇到问题。事实上,我有一个小 api 应该返回我存储在我的 ristretto 缓存中作为 json 的值。问题是当我调用我的函数时,返回的是用base64编码的json,我只是找不到解码它的方法。这是我的代码:第 1 部分:初始化我的 ristretto 缓存的代码: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 插入缓存时将其更改为字符串,如下所示: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吗?提前谢谢你,祝你有美好的一天!
查看完整描述

1 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

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


value, found := ristrettoCache.Get(key)

JSON 编码 a[]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{}

    }

}


查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 194 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信