Eftersom Redis inte har något begrepp om tidsvärden skulle det inte vara meningsfullt för en generisk drivrutin som Redigo att utföra någon automatisk konvertering mellan den inbyggda time.Time
typ och en godtycklig byte-array. Som sådan är det upp till programmeraren att bestämma hur den konverteringen ska utföras.
Om du till exempel har en "Person"-typ definierad som sådan, inklusive en created_at
tidsstämpel formaterad som RFC3339 (en form av ISO 8601), kan du definiera en anpassad "Timestamp"-typ med en "RedisScan"-metod enligt följande:
type Timestamp time.Time
type Person struct {
Id int `redis:"id"`
Name string `redis:"name"`
CreatedAt Timestamp `redis:"created_at"`
}
func (t *Timestamp) RedisScan(x interface{}) error {
bs, ok := x.([]byte)
if !ok {
return fmt.Errorf("expected []byte, got %T", x)
}
tt, err := time.Parse(time.RFC3339, string(bs))
if err != nil {
return err
}
*t = Timestamp(tt)
return nil
}
// ...
response, err := redis.Values(conn.Do("HGETALL", "person:1"))
if err != nil {
panic(err)
}
var p Person
err = redis.ScanStruct(response, &p)
if err != nil {
panic(err)
}
log.Printf("OK: p=%v", p)