1 回答

TA貢獻1780條經驗 獲得超5個贊
函數和方法缺少使該對可用作通用封送/取消封送函數的功能。redis.ScanStructArgs.AddFlat
解決問題的方法取決于您的目標是什么。如果您的目標是加載和保存結構,而不是訪問 Redis 哈希,請參閱將通用結構保存到 Redis。
如果您的目標是訪問具有已定義名稱和值的 Redis 哈希,請編寫在這些定義和 Go 值之間進行轉換的代碼。下面是一個哈希的示例,該哈希被定義為具有字段“時間戳”,其值為十進制編碼的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
}
根據需要調整代碼以匹配 Redis 哈希字段定義。以下是 RFC 3339 格式的時間代碼:
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
}
編寫上面的示例是為了便于將示例擴展到多個字段。如果應用程序只需要訪問單個字段,請將變量和廢話替換為對 或的調用ReadfieldsScanStructredis.Int64(conn.Do("HGET", key, "timestamp")redis.String(conn.Do("HGET", key, "timestamp")
添加回答
舉報