在 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中的rjust()方法使用详解
May 19 Python
python实现下载指定网址所有图片的方法
Aug 08 Python
python实现将内容分行输出
Nov 05 Python
Python2.7简单连接与操作MySQL的方法
Apr 27 Python
Python Pandas找到缺失值的位置方法
Apr 12 Python
浅析Python数据处理
May 02 Python
Python不使用int()函数把字符串转换为数字的方法
Jul 09 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
Mar 01 Python
Python学习笔记之图片人脸检测识别实例教程
Mar 06 Python
详解python statistics模块及函数用法
Oct 27 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
Apr 14 Python
python中random模块详解
Mar 01 Python
Python离线安装openpyxl模块的步骤
解决Jupyter-notebook不弹出默认浏览器的问题
Python爬取科目四考试题库的方法实现
Python如何使用logging为Flask增加logid
Mar 30 #Python
如何在Python中创建二叉树
pycharm2021激活码使用教程(永久激活亲测可用)
python实现web邮箱扫描的示例(附源码)
You might like
php版本的cron定时任务执行器使用实例
2014/08/19 PHP
PHP常用算法和数据结构示例(必看篇)
2017/03/15 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
奇妙的js
2007/09/24 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
JavaScript基础重点(必看)
2016/07/09 Javascript
微信小程序实现瀑布流布局与无限加载的方法详解
2017/05/12 Javascript
对于js垃圾回收机制的理解
2017/09/14 Javascript
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
vuex入门最详细整理
2020/03/04 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
用python实现批量重命名文件的代码
2012/05/25 Python
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
Python基于PycURL实现POST的方法
2015/07/25 Python
wxpython中自定义事件的实现与使用方法分析
2016/07/21 Python
Python装饰器简单用法实例小结
2018/12/03 Python
Django框架安装方法图文详解
2019/11/04 Python
使用Python打造一款间谍程序的流程分析
2020/02/21 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
详解用selenium来下载小姐姐图片并保存
2021/01/26 Python
一款CSS3实现多功能下拉菜单(带分享按)的教程
2014/11/05 HTML / CSS
Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)
2020/03/18 HTML / CSS
Jacques Lemans德国:奥地利钟表品牌
2019/12/26 全球购物
教师专业理论水平的自我评价分享
2013/11/09 职场文书
违反课堂纪律检讨书
2014/01/19 职场文书
社会调查研究计划书
2014/05/01 职场文书
运动员口号
2014/06/09 职场文书
2015年学校党建工作总结
2015/05/19 职场文书
2019最新激励员工口号大全!
2019/06/28 职场文书
六年级上册《闻官军收河南河北》的教学设计
2019/11/15 职场文书
Python人工智能之混合高斯模型运动目标检测详解分析
2021/11/07 Python
关于vue-router-link选择样式设置
2022/04/30 Vue.js