在编写 golang 网络服务器时,我不得不使用某种缓存,所以我选择了 redis。我需要某种采用任何结构并将其保存为 redis 作为值的函数。有什么方法可以做到这一点而不使用interface{}作为接收参数或重复自己太多并且仍然保持类型安全?
Cer*_*món 18
使用gob、json或类似的编码包将结构值编码为 [] 字节。将 []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)
}
Run Code Online (Sandbox Code Playgroud)
像这样使用它来保存一个值:
var v someType
if err := set(c, key, v); err != nil {
// handle error
}
Run Code Online (Sandbox Code Playgroud)
并像这样检索值。请注意,指向该值的指针将传递给get。
var v someType
if err := get(c, key, &v); err != nil {
// handle error
}
Run Code Online (Sandbox Code Playgroud)
详细信息需要根据您使用的 Redis 客户端进行调整。
只要应用程序使用相同类型设置和获取给定键的值,这种方法就可以避免重复并且是类型安全的。
| 归档时间: |
|
| 查看次数: |
7974 次 |
| 最近记录: |