亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 242 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號