在 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从sqlite读取并显示数据的方法
May 08 Python
python简单实现基数排序算法
May 16 Python
查看django执行的sql语句及消耗时间的两种方法
May 29 Python
Python实现模拟登录网易邮箱的方法示例
Jul 05 Python
Python http接口自动化测试框架实现方法示例
Dec 06 Python
python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决
Apr 29 Python
Python generator生成器和yield表达式详解
Aug 08 Python
深度学习入门之Pytorch 数据增强的实现
Feb 26 Python
Python如何使用正则表达式爬取京东商品信息
Jun 01 Python
Python如何截图保存的三种方法(小结)
Sep 01 Python
Python 连接 MySQL 的几种方法
Sep 09 Python
Python基于locals返回作用域字典
Oct 17 Python
Python离线安装openpyxl模块的步骤
解决Jupyter-notebook不弹出默认浏览器的问题
Python爬取科目四考试题库的方法实现
Python如何使用logging为Flask增加logid
Mar 30 #Python
如何在Python中创建二叉树
pycharm2021激活码使用教程(永久激活亲测可用)
python实现web邮箱扫描的示例(附源码)
You might like
php cookie 登录验证示例代码
2009/03/16 PHP
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
2010/03/15 PHP
php导出生成word的方法
2015/12/25 PHP
PHP如何使用Memcached
2016/04/05 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
2017/02/07 PHP
Extjs ajax同步请求时post方式参数发送方式
2009/08/05 Javascript
深入理解JQuery keyUp和keyDown的区别
2013/12/12 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
bootstrap滚动监控器使用方法解析
2017/01/13 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
JS轮播图实现简单代码
2021/02/19 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
vue加载自定义的js文件方法
2018/03/13 Javascript
详解使用WebPack搭建React开发环境
2019/08/06 Javascript
全面解析js中的原型,原型对象,原型链
2021/01/25 Javascript
[10:14]2018DOTA2国际邀请赛寻真——paiN Gaming不仅为自己而战
2018/08/14 DOTA
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
Python 变量类型及命名规则介绍
2013/06/08 Python
python+selenium开发环境搭建图文教程
2017/08/11 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
Flask实现图片的上传、下载及展示示例代码
2018/08/03 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
Django中reverse反转并且传递参数的方法
2019/08/06 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
香港最大的洋酒零售连锁店:屈臣氏酒窖(Watson’s Wine)
2018/12/10 全球购物
高三自我鉴定怎么写
2013/10/19 职场文书
理财投资建议书
2014/03/12 职场文书
公司节能减排方案
2014/05/16 职场文书
高中毕业典礼演讲稿
2014/09/09 职场文书
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python
Python Django项目和应用的创建详解
2021/11/27 Python
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis
SpringBoot中获取profile的方法详解
2022/04/08 Java/Android