在 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 相关文章推荐
9种python web 程序的部署方式小结
Jun 30 Python
Python实现远程调用MetaSploit的方法
Aug 22 Python
Flask入门教程实例:搭建一个静态博客
Mar 27 Python
Windows下搭建python开发环境详细步骤
Jul 20 Python
python matplotlib中文显示参数设置解析
Dec 15 Python
Python中实现变量赋值传递时的引用和拷贝方法
Apr 29 Python
Python占用的内存优化教程
Jul 28 Python
Django3.0 异步通信初体验(小结)
Dec 04 Python
解决Jupyter因卸载重装导致的问题修复
Apr 10 Python
pygame用blit()实现动画效果的示例代码
May 28 Python
Python如何导出导入所有依赖包详解
Jun 08 Python
Pandas数据类型之category的用法
Jun 28 Python
Python离线安装openpyxl模块的步骤
解决Jupyter-notebook不弹出默认浏览器的问题
Python爬取科目四考试题库的方法实现
Python如何使用logging为Flask增加logid
Mar 30 #Python
如何在Python中创建二叉树
pycharm2021激活码使用教程(永久激活亲测可用)
python实现web邮箱扫描的示例(附源码)
You might like
PHP实现的CURL非阻塞调用类
2018/07/26 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
PHP数组Key强制类型转换实现原理解析
2020/09/01 PHP
isArray()函数(JavaScript中对象类型判断的几种方法)
2009/11/26 Javascript
javascript 动态调整图片尺寸实现代码
2009/12/28 Javascript
JavaScript模板引擎用法实例
2015/07/10 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
2016/01/08 Javascript
AngularJS实现自定义指令与控制器数据交互的方法示例
2017/06/19 Javascript
JavaScript 获取元素在父节点中的下标(推荐)
2017/06/28 Javascript
利用node.js实现反向代理的方法详解
2017/07/24 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
vue多种弹框的弹出形式的示例代码
2017/09/18 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
Fetch超时设置与终止请求详解
2019/05/18 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
微信小程序获取用户信息及手机号(后端TP5.0)
2019/09/12 Javascript
python socket网络编程步骤详解(socket套接字使用)
2013/12/06 Python
Python中dictionary items()系列函数的用法实例
2014/08/21 Python
Python制作数据导入导出工具
2015/07/31 Python
浅谈python3中input输入的使用
2019/08/02 Python
利用python绘制中国地图(含省界、河流等)
2020/09/21 Python
英国儿童设计师服装的领先零售商:Base
2019/03/17 全球购物
2014道德模范事迹材料
2014/02/16 职场文书
个人承诺书
2014/03/26 职场文书
考生诚信考试承诺书
2014/05/23 职场文书
危货运输企业安全生产责任书
2014/07/28 职场文书
教师职位说明书
2014/07/29 职场文书
工程承包协议书范本
2014/09/29 职场文书
2014年班主任工作总结
2014/11/08 职场文书
先进个人材料怎么写
2014/12/30 职场文书
教师年度考核个人总结
2015/02/12 职场文书
优秀大学生申请书
2019/06/24 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript
nginx实现发布静态资源的方法
2021/03/31 Servers
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技