在 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 命令行参数sys.argv
Sep 06 Python
python 基础学习第二弹 类属性和实例属性
Aug 27 Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
Jun 21 Python
Python下的常用下载安装工具pip的安装方法
Nov 13 Python
python 回调函数和回调方法的实现分析
Mar 23 Python
OpenCV实现人脸识别
Apr 07 Python
利用python模拟sql语句对员工表格进行增删改查
Jul 05 Python
python实现美团订单推送到测试环境,提供便利操作示例
Aug 09 Python
Python的对象传递与Copy函数使用详解
Dec 26 Python
pytorch实现mnist数据集的图像可视化及保存
Jan 14 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
Jun 04 Python
记录模型训练时loss值的变化情况
Jun 16 Python
Python离线安装openpyxl模块的步骤
解决Jupyter-notebook不弹出默认浏览器的问题
Python爬取科目四考试题库的方法实现
Python如何使用logging为Flask增加logid
Mar 30 #Python
如何在Python中创建二叉树
pycharm2021激活码使用教程(永久激活亲测可用)
python实现web邮箱扫描的示例(附源码)
You might like
php使用SAE原生Mail类实现各种类型邮件发送的方法
2016/10/10 PHP
Yii框架常见缓存应用实例小结
2019/09/09 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
jQuery toggle()设置CSS样式
2009/11/05 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
jquery.form.js实现将form提交转为ajax方式提交的方法
2015/04/07 Javascript
js父页面中使用子页面的方法
2016/01/09 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
Angular4学习笔记router的简单使用
2018/03/30 Javascript
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
python修改注册表终止360进程实例
2014/10/13 Python
python目录与文件名操作例子
2016/08/28 Python
超简单使用Python换脸实例
2019/03/27 Python
python pytest进阶之xunit fixture详解
2019/06/27 Python
浅析PyTorch中nn.Module的使用
2019/08/18 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
Python pip install之SSL异常处理操作
2020/09/03 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
html5时钟实现代码
2010/10/22 HTML / CSS
Puritan’s Pride(普丽普莱)官方网站:美国最大最全的保健品公司之一
2016/10/23 全球购物
Kaufmann Mercantile官网:家居装饰、配件、户外及更多
2018/09/28 全球购物
这段代码难道不该打印出56吗
2013/02/27 面试题
C++面试题:关于链表和指针
2013/06/05 面试题
大学生毕业自我评价范文分享
2013/11/11 职场文书
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
建筑施工员岗位职责
2013/11/26 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
初一军训感言
2015/08/01 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
基于PyQt5制作一个群发邮件工具
2022/04/08 Python
JS实现简单的九宫格抽奖
2022/06/28 Javascript