3 回答
TA贡献1834条经验 获得超8个赞
首先,您应该使用redis而不是json标签来标记您的字段名称,这就是 redigo 用于 ScanStruct() 的内容。例如
type Model struct {
A string `redis:"a"`
B string `redis:"b"`
C string `redis:"c"` // Unknown length of map at runtime
}
其次,您的成员是字符串,因此您不能让个人成员访问他们的内容,而且我认为您无法使用 redigo 将其自动化。
作为变通方法,您可以使用某种扩展字符串的类型,并使用访问方法将 json 延迟解析为底层 dict,然后返回值。像这样的东西(没有测试就写,只是一般的想法,我不确定它会起作用但值得一试):
type MyString string
func (s MyString)Get(key string) (interface{}, error) {
var m map[string]interface{}
if err := json.Unmarshal([]byte(s), &m); err != nil {
return nil, err
}
return m[key], nil
}
它也不是很有效,因为它每次都会再次解析 json。就我个人而言,我会将整个模型事物包装在一个结构中,该结构在从 redigo 反序列化的同时在幕后执行所有逻辑。
TA贡献1793条经验 获得超6个赞
查看RedisLabs 的 ReJSON模块。
我在这里为它创建了一个简单的 go-client,它可以与 Redigo 一起使用。
type Model struct {
A string `redis:"a" json:"a"`
B string `redis:"b" json:"b"`
C string `redis:"c" json:"c"`
}
要读回它,请使用JSON.GET命令,
v, err := redis.Bytes(rejson.JSONGet(conn, "id:123", ""))
if err != nil {
return
}
m := new(Model)
err = json.Unmarshal(v, m)
if err != nil {
return
}
TA贡献1873条经验 获得超9个赞
type Model struct {
A string `redis:"a" json:"a"`
B string `redis:"b" json:"b"`
C string `redis:"c" json:"c"`
}
您可以同时使用redis标签和json标签。
ScanStruct 应该可以正常工作,它使用redis标签。
m := Model
v, err := redis.Values(c.Do("HGETALL", key))
err = redis.ScanStruct(v, &m)
- 3 回答
- 0 关注
- 285 浏览
添加回答
举报