在编写golang web服务器时,我需要使用某种缓存,所以我选择了redis。
我需要一些函数来将任何结构作为值保存到redis中。
有没有不使用interface{}
作为接收参数或重复自己过多而仍然保持类型安全的方法来实现这个功能呢?
使用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客户端进行调整。
这种方法避免了重复,只要应用程序使用相同类型设置和获取给定键的值,就是类型安全的。