在 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 相关文章推荐
利用一个简单的例子窥探CPython内核的运行机制
Mar 30 Python
python解决Fedora解压zip时中文乱码的方法
Sep 18 Python
python 系统调用的实例详解
Jul 11 Python
浅谈python 里面的单下划线与双下划线的区别
Dec 01 Python
解决Matplotlib图表不能在Pycharm中显示的问题
May 24 Python
深入解析Python小白学习【操作列表】
Mar 23 Python
Python 词典(Dict) 加载与保存示例
Dec 06 Python
python用pip install时安装失败的一系列问题及解决方法
Feb 24 Python
Python使用多进程运行含有任意个参数的函数
May 02 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
May 26 Python
Python中实现一行拆多行和多行并一行的示例代码
Sep 06 Python
python 求两个向量的顺时针夹角操作
Mar 04 Python
Python离线安装openpyxl模块的步骤
解决Jupyter-notebook不弹出默认浏览器的问题
Python爬取科目四考试题库的方法实现
Python如何使用logging为Flask增加logid
Mar 30 #Python
如何在Python中创建二叉树
pycharm2021激活码使用教程(永久激活亲测可用)
python实现web邮箱扫描的示例(附源码)
You might like
PHP nl2br函数 将换行字符转成 <br>
2009/08/21 PHP
浅谈PHP强制类型转换,慎用!
2013/06/06 PHP
php使用memcoder将视频转成mp4格式的方法
2015/03/12 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
2020/05/26 PHP
学习ExtJS TextField常用方法
2009/10/07 Javascript
解决JS中乘法的浮点错误的方法
2014/01/03 Javascript
javascript学习笔记(七)Ajax和Http状态码
2014/10/08 Javascript
Javascript添加监听与删除监听用法详解
2014/12/19 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
深入浅析jQuery对象$.html
2016/08/22 Javascript
js字符串引用的两种方式(必看)
2016/09/18 Javascript
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
微信小程序 实现点击添加移除class
2017/06/12 Javascript
angularjs实现柱状图动态加载的示例
2017/12/11 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
修改Python的pyxmpp2中的主循环使其提高性能
2015/04/24 Python
Python用zip函数同时遍历多个迭代器示例详解
2016/11/14 Python
python 实现删除文件或文件夹实例详解
2016/12/04 Python
简述Python2与Python3的不同点
2018/01/21 Python
代码讲解Python对Windows服务进行监控
2018/02/11 Python
Python实现繁?转为简体的方法示例
2018/12/18 Python
python 为什么说eval要慎用
2019/03/26 Python
Django之PopUp的具体实现方法
2019/08/31 Python
python requests模拟登陆github的实现方法
2019/12/26 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
浅谈Html5中视频 音频标签 进度条的问题
2016/07/26 HTML / CSS
校友会欢迎辞
2014/01/13 职场文书
电信营业员自我评价分享
2014/01/17 职场文书
军神教学反思
2014/02/04 职场文书
职称评定个人总结
2015/03/05 职场文书
Java 中的 Unsafe 魔法类的作用大全
2021/06/26 Java/Android