在 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字符串格式化
Jun 15 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
Dec 31 Python
python 打印对象的所有属性值的方法
Sep 11 Python
磁盘垃圾文件清理器python代码实现
Aug 24 Python
python3实现小球转动抽奖小游戏
Apr 15 Python
PyQt5 QTableView设置某一列不可编辑的方法
Jun 25 Python
python selenium 执行完毕关闭chromedriver进程示例
Nov 15 Python
opencv python图像梯度实例详解
Feb 04 Python
Python操作注册表详细步骤介绍
Feb 05 Python
Python使用UDP实现720p视频传输的操作
Apr 24 Python
pandas进行数据输入和输出的方法详解
Mar 23 Python
Python OpenCV实现图形检测示例详解
Apr 08 Python
Python离线安装openpyxl模块的步骤
解决Jupyter-notebook不弹出默认浏览器的问题
Python爬取科目四考试题库的方法实现
Python如何使用logging为Flask增加logid
Mar 30 #Python
如何在Python中创建二叉树
pycharm2021激活码使用教程(永久激活亲测可用)
python实现web邮箱扫描的示例(附源码)
You might like
PHP令牌 Token改进版
2008/07/18 PHP
PHP curl_setopt()函数实例代码与参数分析
2011/06/02 PHP
细谈php中SQL注入攻击与XSS攻击
2012/06/10 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
PHP网站常见安全漏洞,及相应防范措施总结
2021/03/01 PHP
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
Jquery动态更改一张位图的src与Attr的使用
2013/07/31 Javascript
浅谈使用MVC模式进行JavaScript程序开发
2015/11/10 Javascript
JS模仿手机端九宫格登录功能实现代码
2016/04/28 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
深入理解Nodejs Global 模块
2017/06/03 NodeJs
jQuery Validate格式验证功能实例代码(包括重名验证)
2017/07/18 jQuery
vue.js异步上传文件前后端实现代码
2017/08/22 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
Vue 重置组件到初始状态的方法示例
2018/10/10 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
node.js获取参数的常用方法(总结)
2017/05/29 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
2018/01/04 Python
python监控文件并且发送告警邮件
2018/06/21 Python
Python读取mat文件,并转为csv文件的实例
2018/07/04 Python
[机器视觉]使用python自动识别验证码详解
2019/05/16 Python
python爬虫爬取笔趣网小说网站过程图解
2019/11/18 Python
Pytorch上下采样函数--interpolate用法
2020/07/07 Python
Python实现一个简单的递归下降分析器
2020/08/01 Python
Python识别处理照片中的条形码
2020/11/16 Python
网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
2016/03/27 面试题
双十佳事迹材料
2014/01/29 职场文书
公务员培训自我鉴定
2014/02/01 职场文书
大一学生职业生涯规划
2014/03/11 职场文书
县级文明单位申报材料
2014/05/23 职场文书
我的中国梦演讲稿高中篇
2014/08/19 职场文书
五星级酒店前台接待岗位职责
2015/04/02 职场文书
十二生肖观后感
2015/06/12 职场文书
优秀党员主要事迹材料
2015/11/04 职场文书