在 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中的URLError异常的方法
Apr 30 Python
python实现画一颗树和一片森林
Jun 25 Python
python tornado微信开发入门代码
Aug 24 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
Mar 27 Python
利用PyCharm Profile分析异步爬虫效率详解
May 08 Python
详解numpy的argmax的具体使用
May 27 Python
在python中画正态分布图像的实例
Jul 08 Python
python django下载大的csv文件实现方法分析
Jul 19 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
Dec 27 Python
python获取百度热榜链接的实例方法
Aug 25 Python
Python之qq自动发消息的示例代码
Feb 18 Python
用Python selenium实现淘宝抢单机器人
Jun 18 Python
Python离线安装openpyxl模块的步骤
解决Jupyter-notebook不弹出默认浏览器的问题
Python爬取科目四考试题库的方法实现
Python如何使用logging为Flask增加logid
Mar 30 #Python
如何在Python中创建二叉树
pycharm2021激活码使用教程(永久激活亲测可用)
python实现web邮箱扫描的示例(附源码)
You might like
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
php HandlerSocket的使用
2011/05/02 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
js验证表单大全
2006/11/25 Javascript
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
jQuery AJAX实现调用页面后台方法和web服务定义的方法分享
2012/03/01 Javascript
JavaScript基本语法讲解
2015/06/03 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
用JS动态改变表单form里的action值属性的两种方法
2016/05/25 Javascript
原生js图片轮播效果实现代码
2016/10/19 Javascript
AngularJS实现用户登录状态判断的方法(Model添加拦截过滤器,路由增加限制)
2016/12/12 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
React中的refs的使用教程
2018/02/13 Javascript
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
基于Vue实现微前端的示例代码
2020/04/24 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
[02:20]DOTA2亚洲邀请赛 IG战队出场宣传片
2015/02/07 DOTA
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
Python实现配置文件备份的方法
2015/07/30 Python
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
python在线编译器的简单原理及简单实现代码
2018/02/02 Python
python web框架 django wsgi原理解析
2019/08/20 Python
python @propert装饰器使用方法原理解析
2019/12/25 Python
Python常用编译器原理及特点解析
2020/03/23 Python
利用Python过滤相似文本的简单方法示例
2021/02/03 Python
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
戴尔英国官网:Dell英国
2017/05/27 全球购物
OnePlus加拿大官网:中国国际化手机品牌
2020/10/13 全球购物
什么是数据库锁?Oracle中都有哪些类型的锁?
2015/08/21 面试题
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python
Python基础教程,Python入门教程(超详细)
2021/06/24 Python
十大公认最好看的动漫:《咒术回战》在榜,《钢之炼金术师》第一
2022/03/18 日漫