在编写golang webserver时,我不得不使用某种缓存,所以我选择了redis . 我需要一些带有任何结构的函数,并将其保存为redis作为值 . 有没有办法做到这一点,不使用 interface{} 作为接收参数或重复自己太多,仍然保持类型安全?
interface{}
使用gob,json或类似的编码包将struct值编码为[]字节 . 将[]字节存储在Redis中 . 获取数据时反转过程 .
假设Redis客户端具有Set和Get的方法,使用JSON包的代码将如下所示:
func set(c *RedisClient, key string, value interface{}) error { p, err := json.Marshal(value) if err != nil { return err } return c.Set(key, p) } func get(c *RedisClient, key string, dest interface{}) error { p, err := c.Get(key) if err != nil { return err } return json.Unmarshal(p, dest) }
像这样使用它来保存值:
var v someType if err := set(c, key, v); err != nil { // handle error }
并像这样检索一个值 . 请注意,指向该值的指针将传递给 get .
get
var v someType if err := get(c, key, &v); err != nil { // handle error }
需要根据您使用的Redis客户端调整详细信息 .
只要应用程序使用相同类型设置并获取给定键的值,此方法就可以避免重复并且类型安全 .
1 回答
使用gob,json或类似的编码包将struct值编码为[]字节 . 将[]字节存储在Redis中 . 获取数据时反转过程 .
假设Redis客户端具有Set和Get的方法,使用JSON包的代码将如下所示:
像这样使用它来保存值:
并像这样检索一个值 . 请注意,指向该值的指针将传递给
get
.需要根据您使用的Redis客户端调整详细信息 .
只要应用程序使用相同类型设置并获取给定键的值,此方法就可以避免重复并且类型安全 .