在编写golang网络服务器时,我不得不使用某种缓存,所以我选择了redis。
我需要某种采用任何结构并将其保存为Redis值的函数。
是否有任何方法可以不使用interface{}
作为接收参数或重复我自己太多而仍保持类型安全?
答案 0 :(得分:3)
使用gob,json或类似的编码包将结构值编码为[] byte。将[] byte存储在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
。
var v someType
if err := get(c, key, &v); err != nil {
// handle error
}
需要根据所使用的Redis客户端来调整详细信息。
只要应用程序设置并使用相同类型获取给定键的值,这种方法就可以避免重复并且是类型安全的。