在 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中针对函数处理的特殊方法
Mar 06 Python
Django 如何获取前端发送的头文件详解(推荐)
Aug 15 Python
在dataframe两列日期相减并且得到具体的月数实例
Jul 03 Python
pycharm 将python文件打包为exe格式的方法
Jan 16 Python
使用python实现简单五子棋游戏
Jun 18 Python
在 Pycharm 安装使用black的方法详解
Apr 02 Python
Python-jenkins 获取job构建信息方式
May 12 Python
django日志默认打印request请求信息的方法示例
May 17 Python
Python xlwt模块使用代码实例
Jun 10 Python
利用python制作拼图小游戏的全过程
Dec 04 Python
Pytorch中的学习率衰减及其用法详解
Jun 05 Python
Python Matplotlib绘制两个Y轴图像
Apr 13 Python
Python离线安装openpyxl模块的步骤
解决Jupyter-notebook不弹出默认浏览器的问题
Python爬取科目四考试题库的方法实现
Python如何使用logging为Flask增加logid
Mar 30 #Python
如何在Python中创建二叉树
pycharm2021激活码使用教程(永久激活亲测可用)
python实现web邮箱扫描的示例(附源码)
You might like
也谈截取首页新闻 - 范例
2006/10/09 PHP
php+mysql事务rollback&commit示例
2010/02/08 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
2013/06/29 PHP
php 使用html5实现多文件上传实例
2016/10/24 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
2015/05/04 Javascript
更高效的使用JQuery 这里总结了8个小技巧
2016/04/13 Javascript
ES6 Proxy实现Vue的变化检测问题
2019/06/11 Javascript
小程序表单认证布局及验证详解
2020/06/19 Javascript
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
Python datetime时间格式化去掉前导0
2014/07/31 Python
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
2019/07/04 Python
python用match()函数爬数据方法详解
2019/07/23 Python
python3.6编写的单元测试示例
2019/08/17 Python
python 实现将Numpy数组保存为图像
2020/01/09 Python
python实现KNN近邻算法
2020/12/30 Python
基础的CSS3弹性盒Flexbox布局使用实例
2016/04/08 HTML / CSS
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
英国在线购买马术服装:EQUUS
2019/07/12 全球购物
Nº21官方在线商店:numeroventuno.com
2019/09/26 全球购物
俄罗斯在线购买飞机票、火车票、巴士票网站:Tutu.ru
2020/03/16 全球购物
程序员岗位职责
2013/11/11 职场文书
会计专业大学生求职信范文
2014/01/28 职场文书
铁路个人事迹材料
2014/01/30 职场文书
拉拉队口号
2014/06/16 职场文书
树转促学习心得体会
2014/09/10 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
酒店财务总监岗位职责
2015/04/03 职场文书
水电施工员岗位职责
2015/04/11 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书