在 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生成式的send()方法(详解)
May 08 Python
Django自定义分页与bootstrap分页结合
Feb 22 Python
解读python logging模块的使用方法
Apr 17 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
Python使用一行代码获取上个月是几月
Aug 30 Python
Pycharm更换python解释器的方法
Oct 29 Python
python3 中文乱码与默认编码格式设定方法
Oct 31 Python
python3 下载网络图片代码实例
Aug 27 Python
python定义类self用法实例解析
Jan 22 Python
从0到1使用python开发一个半自动答题小程序的实现
May 12 Python
基于python实现查询ip地址来源
Jun 02 Python
总结Pyinstaller的坑及终极解决方法(小结)
Sep 21 Python
Python离线安装openpyxl模块的步骤
解决Jupyter-notebook不弹出默认浏览器的问题
Python爬取科目四考试题库的方法实现
Python如何使用logging为Flask增加logid
Mar 30 #Python
如何在Python中创建二叉树
pycharm2021激活码使用教程(永久激活亲测可用)
python实现web邮箱扫描的示例(附源码)
You might like
基于php和mysql的简单的dao类实现crud操作功能
2014/01/27 PHP
php邮箱地址正则表达式验证
2015/11/13 PHP
Docker配置PHP开发环境教程
2016/12/21 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
2017/04/27 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
Jquery中给animation加更多的运作效果实例
2013/09/05 Javascript
Node.js实现JS文件合并小工具
2016/02/02 Javascript
javascript中apply、call和bind的使用区别
2016/04/05 Javascript
nodejs超出最大的调用栈错误问题
2017/12/27 NodeJs
Vue中的v-for指令不起效果的解决方法
2018/09/27 Javascript
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
2018/12/13 Javascript
jquery-ui 进度条功能示例【测试可用】
2019/07/25 jQuery
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
原生JS实现贪吃蛇小游戏
2020/03/09 Javascript
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
2020/10/27 Javascript
[58:21]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第二场
2018/04/04 DOTA
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
Python中 传递值 和 传递引用 的区别解析
2018/02/22 Python
对Python中TKinter模块中的Label组件实例详解
2019/06/14 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
HTML5 Canvas 实现K线图的示例代码
2019/12/23 HTML / CSS
美国第一香水网站:Perfume.com
2017/01/23 全球购物
Ellesse英国官网:意大利高级运动品牌
2019/07/23 全球购物
骨干教师培训制度
2014/01/13 职场文书
开学典礼决心书
2014/03/11 职场文书
学校领导四风问题整改措施思想汇报
2014/10/09 职场文书
党的群众路线教育实践活动整改方案
2014/10/28 职场文书
群众路线学习笔记范文
2014/11/06 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
校友回访母校寄语
2015/02/26 职场文书
会计专业自荐信范文
2019/05/22 职场文书
Pandas数据类型之category的用法
2021/06/28 Python