在 Golang 中实现 Cache::remember 方法详解


Posted in Python onMarch 30, 2021

项目需要把部分代码移植到 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()
}
  • 如上 c.say() 代码,在别的语言里应该是输出 i am child 才对, 而 Golang 不一样,查了一下 Golang 的资料才能理解 https://golang.org/ref/spec#Selectors
  • 大致意思是说,通过 x.f 调用 f 方法或者属性时,从当前或者嵌套匿名结构体由浅到深的去调用,而不会去寻找上级
  • 比如 child1 没有 Say 方法,会进入到匿名结构体 Parent 找到 Say 方法,然后调用
  • 而 child 也没有 Say 方法,同样去调用 Parent 的 Say 方法,这时候 Say 是通过 Parent 调用的, 当在 Say 里调用 s.Name 方法,并不能找到 child , 所以还是会调用到 Parent 的 Name 方法
  • 然后自己整理和同事一起写了大致的 remember 方法
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 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用Python实现BT种子和磁力链接的相互转换
Nov 09 Python
简单解决Python文件中文编码问题
Nov 22 Python
Tensorflow简单验证码识别应用
May 25 Python
Python查询IP地址归属完整代码
Jun 21 Python
详解如何利用Cython为Python代码加速
Jan 27 Python
python脚本和网页有何区别
Jul 02 Python
使用Keras建立模型并训练等一系列操作方式
Jul 02 Python
python如何将图片转换素描画
Sep 08 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
Python random模块的使用示例
Oct 10 Python
Jupyter安装链接aconda实现过程图解
Nov 02 Python
Python入门之基础语法详解
May 11 Python
Python离线安装openpyxl模块的步骤
解决Jupyter-notebook不弹出默认浏览器的问题
Python爬取科目四考试题库的方法实现
Python如何使用logging为Flask增加logid
Mar 30 #Python
如何在Python中创建二叉树
pycharm2021激活码使用教程(永久激活亲测可用)
python实现web邮箱扫描的示例(附源码)
You might like
PHP概述.
2006/10/09 PHP
对squid中refresh_pattern的一些理解和建议
2009/04/17 PHP
jQuery EasyUI API 中文文档 - Draggable 可拖拽
2011/09/29 Javascript
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
JQuery for与each性能比较分析
2013/05/14 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
使用python将大量数据导出到Excel中的小技巧分享
2018/06/14 Python
win10系统下Anaconda3安装配置方法图文教程
2018/09/19 Python
Python构建图像分类识别器的方法
2019/01/12 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
python重要函数eval多种用法解析
2020/01/14 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
tensorflow与numpy的版本兼容性问题的解决
2021/01/08 Python
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
html5小程序飞入购物车(抛物线绘制运动轨迹点)
2020/10/19 HTML / CSS
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
西班牙汉普顿小姐:购买帆布鞋和太阳镜
2016/10/23 全球购物
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
聪明的粉丝购买门票的地方:TickPick
2018/03/09 全球购物
彪马俄罗斯官网:PUMA俄罗斯
2019/07/13 全球购物
Android笔试题总结
2014/11/29 面试题
工商管理实习自我鉴定
2013/09/28 职场文书
2014年健康教育实施方案
2014/02/17 职场文书
计算机应届毕业生自荐信范文
2014/02/23 职场文书
给孩子的新年寄语
2014/04/08 职场文书
个人四风对照检查材料
2014/09/26 职场文书
干部作风建设心得体会
2014/10/22 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
2015年小学美术工作总结
2015/05/25 职场文书
敬老院活动感想
2015/08/07 职场文书
《水浒传》读后感3篇(范文)
2019/09/19 职场文书
Vue的生命周期一起来看看
2022/02/24 Vue.js