beego 的缓存如何转结构体呢?

写入缓存

func SetCategory(category models.Category) {
    _ = BM.Put("category", category, 1000*time.Second)
}

但是获取的时候

func GetCategory() []models.Category {
    category := BM.Get("category")
    fmt.Println(category.([]models.Category))
    return nil
}

这里无法转为结构体
有什么办法转呢?

func (c *CategoryController) Index() {

    var category []models.Category
    category = dao.GetCategory()

    if category == nil {
        m := new(models.Category)

        category, _ = m.GetList()
        dao.SetCategory(category)
    }

    c.Data["category"] = category

    c.TplName = "admin/category/index.html"
}
阅读 350
评论 2019-08-14 提问
    3 个回答
    darjun
    • 1.9k

    存的时候用model.Category,转的时候用[]model.Category,类型都不相同,肯定不行。
    建议把错误贴出来

    评论 赞赏 2019-08-14

      声明下,我没用过 beego,按你的问题,看了下它的代码,并写了小例子测试了下。

      可以先看下 Cache 接口定义:

      type Cache interface {
          Get(key string) interface{}
          GetMulti(keys []string) []interface{}
          Put(key string, val interface{}, timeout time.Duration) error
          Delete(key string) error
          Incr(key string) error
          Decr(key string) error
          IsExist(key string) bool
          ClearAll() error
          StartAndGC(config string) error
      }

      Put 并不是理解的 list 追加,与 Get 的区别只是多了一个过期时间。所以,你 Put 的是啥,那 Get 就是啥。如果要获取的切片,那 Put 时也必须是切片。

      package main
      
      import (
          "fmt"
          "github.com/astaxie/beego/cache"
          "time"
      )
      
      type User struct {
          Name string
      }
      
      func main() {
          bm, err := cache.NewCache("memory", `{"interval":60}`)
          if err != nil {
              panic(err)
          }
      
          err = bm.Put("users", []User{{Name: "poloxue"}}, 10*time.Second)
          if err != nil {
              panic(err)
          }
      
          view := bm.Get("users")
          fmt.Println(view.([]User))
      }
      评论 赞赏 2019-08-14

        目前用的办法为:

        func GetCategory() []models.Category {
            category := BM.Get("category")
            if category == nil{
                return nil
            }
            var data []models.Category
            _ = json.Unmarshal(category.([]uint8), &data)
        
            return data
        }
        评论 赞赏 2019-08-14
          撰写回答

          登录后参与交流、获取后续更新提醒