在 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带你玩转冲顶大会
Jan 17 Python
Python实现登陆文件验证方法
Oct 06 Python
python根据txt文本批量创建文件夹
Dec 08 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
python制作英语翻译小工具代码实例
Sep 09 Python
Python多线程爬取豆瓣影评API接口
Oct 22 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
Mar 30 Python
python中Ansible模块的Playbook的具体使用
May 28 Python
如何用Python 加密文件
Sep 10 Python
Django正则URL匹配实现流程解析
Nov 13 Python
 Python 中 logging 模块使用详情
Mar 03 Python
Python离线安装openpyxl模块的步骤
解决Jupyter-notebook不弹出默认浏览器的问题
Python爬取科目四考试题库的方法实现
Python如何使用logging为Flask增加logid
Mar 30 #Python
如何在Python中创建二叉树
pycharm2021激活码使用教程(永久激活亲测可用)
python实现web邮箱扫描的示例(附源码)
You might like
作为PHP程序员应该了解MongoDB的五件事
2013/06/03 PHP
php简单的上传类分享
2016/05/15 PHP
Jquery Autocomplete 结合asp.net使用要点
2010/10/29 Javascript
各浏览器对link标签onload/onreadystatechange事件支持的差异分析
2011/04/27 Javascript
jquery 层次选择器siblings与nextAll的区别介绍
2013/08/02 Javascript
JavaScript获取图片的原始尺寸以宽度为例
2014/05/04 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
简单谈谈ES6的六个小特性
2016/11/18 Javascript
浅析Jquery操作select
2016/12/13 Javascript
react性能优化达到最大化的方法 immutable.js使用的必要性
2017/03/09 Javascript
Vue自定义图片懒加载指令v-lazyload详解
2020/12/31 Javascript
webpack4.0 入门实践教程
2018/10/08 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
vue使用screenfull插件实现全屏功能
2020/09/17 Javascript
如何利用JavaScript编写一个格斗小游戏
2021/01/06 Javascript
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
Python中分数的相关使用教程
2015/03/30 Python
Python中列表list以及list与数组array的相互转换实现方法
2017/09/22 Python
Python连接phoenix的方法示例
2017/09/29 Python
python自动裁剪图像代码分享
2017/11/25 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
对pandas中两种数据类型Series和DataFrame的区别详解
2018/11/12 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
2018/12/26 Python
python3中编码获取网页的实例方法
2020/11/16 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
python中封包建立过程实例
2021/02/18 Python
携程旅行网:中国领先的在线旅行服务公司
2017/02/17 全球购物
业务经理的岗位职责
2013/11/16 职场文书
宿舍标语大全
2014/06/19 职场文书
大学生翘课检讨书范文
2014/10/06 职场文书
超搞笑婚前保证书
2015/05/08 职场文书
投资申请报告
2015/05/19 职场文书
2015年妇委会工作总结
2015/05/22 职场文书
Python Pandas pandas.read_sql函数实例用法
2021/06/21 Python
java实现自定义时钟并实现走时功能
2022/06/21 Java/Android
win10电脑右下角输入法图标不见了?Win10右下角不显示输入法的解决方法
2022/07/23 数码科技