1 回答

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊
函數(shù)和方法缺少使該對(duì)可用作通用封送/取消封送函數(shù)的功能。redis.ScanStructArgs.AddFlat
解決問題的方法取決于您的目標(biāo)是什么。如果您的目標(biāo)是加載和保存結(jié)構(gòu),而不是訪問 Redis 哈希,請(qǐng)參閱將通用結(jié)構(gòu)保存到 Redis。
如果您的目標(biāo)是訪問具有已定義名稱和值的 Redis 哈希,請(qǐng)編寫在這些定義和 Go 值之間進(jìn)行轉(zhuǎn)換的代碼。下面是一個(gè)哈希的示例,該哈希被定義為具有字段“時(shí)間戳”,其值為十進(jìn)制編碼的Unix秒:
type Data struct {
Timestamp time.Time
}
func (r *RedisRepo) Write(data Data, key string) error {
conn := r.pool.Get()
defer conn.Close()
_, err := conn.Do("HSET", key, "timestamp", data.Timestamp.Unix())
return err
}
func (r *RedisRepo) Read(key string) (*Data, error) {
conn := r.pool.Get()
defer conn.Close()
v, err := redis.Values(conn.Do("HGETALL", key))
if err != nil {
return nil, err
}
var fields struct {
Timestamp int64 `redis:"timestamp"`
}
err = redis.ScanStruct(v, &fields)
if err != nil {
return nil, err
}
return &Data{Timestamp: time.Unix(fields.Timestamp, 0)}, nil
}
根據(jù)需要調(diào)整代碼以匹配 Redis 哈希字段定義。以下是 RFC 3339 格式的時(shí)間代碼:
type Data struct {
Timestamp time.Time
}
func (r *RedisRepo) Write(data Data, key string) error {
conn := r.pool.Get()
defer conn.Close()
_, err := conn.Do("HSET", key, "timestamp", data.Timestamp.Format(time.RFC3339))
return err
}
func (r *RedisRepo) Read(key string) (*Data, error) {
conn := r.pool.Get()
defer conn.Close()
v, err := redis.Values(conn.Do("HGETALL", key))
if err != nil {
return nil, err
}
var fields struct {
Timestamp string `redis:"timestamp"`
}
err = redis.ScanStruct(v, &fields)
if err != nil {
return nil, err
}
t, err := time.Parse(time.RFC3339, fields.Timestamp)
if err != nil {
return nil, err
}
return &Data{Timestamp: t}, nil
}
編寫上面的示例是為了便于將示例擴(kuò)展到多個(gè)字段。如果應(yīng)用程序只需要訪問單個(gè)字段,請(qǐng)將變量和廢話替換為對(duì) 或的調(diào)用ReadfieldsScanStructredis.Int64(conn.Do("HGET", key, "timestamp")redis.String(conn.Do("HGET", key, "timestamp")
添加回答
舉報(bào)