项目需要把部分代码移植到 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() }
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 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
标签:电子产品 辽宁 物业服务 青海 海南 儋州 西双版纳 安康
巨人网络通讯声明:本文标题《在 Golang 中实现 Cache::remember 方法详解》,本文关键词 在,Golang,中,实现,Cache,remember,;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。