3 回答

TA貢獻1834條經(jīng)驗 獲得超8個贊
首先,您應該使用redis而不是json標簽來標記您的字段名稱,這就是 redigo 用于 ScanStruct() 的內(nèi)容。例如
type Model struct {
A string `redis:"a"`
B string `redis:"b"`
C string `redis:"c"` // Unknown length of map at runtime
}
其次,您的成員是字符串,因此您不能讓個人成員訪問他們的內(nèi)容,而且我認為您無法使用 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 反序列化的同時在幕后執(zhí)行所有邏輯。

TA貢獻1793條經(jīng)驗 獲得超6個贊
查看RedisLabs 的 ReJSON模塊。
我在這里為它創(chuàng)建了一個簡單的 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條經(jīng)驗 獲得超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 關注
- 307 瀏覽
添加回答
舉報