• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    在 Golang 中实现 Cache::remember 方法详解
    POST TIME:2021-10-18 17:10

    项目需要把部分代码移植到 Golang , 之前用 Laravel 封装的写起来很舒服,在 Golang 里只能自动动手实现.
    一开始想的是使用 interface 实现,但是遇到了一个坑, Golang 里的组合是一个虚假的继承

    package main
     
    import "fmt"
     
    type Person interface {
     Say()
     Name()
    }
     
    type Parent struct {
    }
     
    func (s *Parent) Say() {
     fmt.Println("i am " + s.Name())
    }
     
    func (s *Parent) Name() string {
     return "parent"
    }
     
    type Child struct {
     Parent
    }
     
    func (s *Child) Name() string {
     return "child"
    }
     
    type Child1 struct {
     Parent
    }
     
    func main() {
     
     var c Child
     // i am parent
     c.Say()
     
     var c1 Child1
     // i am parent
     c1.Say()
    }
    
    import (
     "context"
     "encoding/json"
     "fmt"
     "github.com/gin-gonic/gin"
     "time"
    )
     
    // redis 操作已经简化
    func CacheGet(c context.Context, t interface{}, cacheKey string, callQuery func() error) error {
     
     // 此处通过 redis 获取数据, 如果存在数据, 那么直接返回
     dataBytes, err := redis.Get(c, cacheKey).Bytes()
     if err == nil {
      if err := json.Unmarshal(dataBytes, t); err == nil {
       return nil
      }
     }
     
     // 当 redis 没有数据, 那么调用此方法修改 t,
     if err := callQuery(); err != nil {
     
      return err
     }
     
     // 这里把修改之后的 t 存储到 redis, 下次使用便可以使用缓存
     dataBytes, err = json.Marshal(t)
     if err == nil {
      redis.Set(c, cacheKey, dataBytes, time.Minute*30)
     }
     return nil
    }
     
    func handle(c *gin.Context) {
     
     var model models.User
     err := utils.CacheGet(
      c.Request.Context(),
      model,
      fmt.Sprintf("cache_xxx:%s", c.Param("id")),
      func() error {
     
       return db.First(model)
      },
     )
    }

    到此这篇关于在 Golang 中实现 Cache::remember 方法的文章就介绍到这了,更多相关Golang实现 Cache::remember 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    上一篇:golang中的空接口使用详解
    下一篇:用Go+WebSocket快速实现一个chat服务
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信