在 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 将字符串转换成字典dict
Mar 24 Python
python的迭代器与生成器实例详解
Jul 16 Python
如何解决django配置settings时遇到Could not import settings 'conf.local'
Nov 18 Python
python回溯法实现数组全排列输出实例分析
Mar 17 Python
Python生成数字图片代码分享
Oct 31 Python
python判断字符串是否是json格式方法分享
Nov 07 Python
零基础使用Python读写处理Excel表格的方法
May 02 Python
python Gunicorn服务器使用方法详解
Jul 22 Python
IronPython连接MySQL的方法步骤
Dec 27 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
Feb 26 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
Apr 25 Python
Python离线安装openpyxl模块的步骤
解决Jupyter-notebook不弹出默认浏览器的问题
Python爬取科目四考试题库的方法实现
Python如何使用logging为Flask增加logid
Mar 30 #Python
如何在Python中创建二叉树
pycharm2021激活码使用教程(永久激活亲测可用)
python实现web邮箱扫描的示例(附源码)
You might like
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
Yii扩展组件编写方法实例分析
2015/06/29 PHP
基于ThinkPHP实现批量删除
2015/12/18 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
web基于浏览器的本地存储方法应用
2012/11/27 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
2014/12/16 Javascript
jquery中trigger()无法触发hover事件的解决方法
2015/05/07 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
使用纯JS代码判断字符串中有多少汉字的实现方法(超简单实用)
2016/11/12 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
2017/01/11 Javascript
基于vue实现多引擎搜索及关键字提示
2017/03/16 Javascript
Less 安装及基本用法
2018/05/05 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
微信小程序实现跑马灯效果
2020/10/21 Javascript
基于vue实现一个神奇的动态按钮效果
2019/05/15 Javascript
详解Vue的mixin策略
2020/11/19 Vue.js
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
[46:47]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS NE
2014/05/22 DOTA
[43:43]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第三场 11.29
2020/12/02 DOTA
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
libreoffice python 操作word及excel文档的方法
2019/07/04 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
python 利用turtle库绘制笑脸和哭脸的例子
2019/11/23 Python
自荐信格式的六要素
2013/09/21 职场文书
酒吧员工的岗位职责
2013/11/26 职场文书
50岁生日感言
2014/01/23 职场文书
生物科学专业职业规划书范文
2014/02/11 职场文书
单位未婚证明范本
2014/11/25 职场文书
放弃继承权公证书
2015/01/23 职场文书
通知格式
2015/04/27 职场文书
2015年大学辅导员工作总结
2015/05/12 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
Python NumPy灰度图像的压缩原理讲解
2021/08/04 Python