Da Redis ikke har noget begreb om tidsværdier, ville det ikke give nogen mening for en generisk driver som f.eks. Redigo at udføre en eller anden automatisk konvertering mellem den indbyggede time.Time
type og et vilkårligt byte-array. Som sådan er det op til programmøren at beslutte, hvordan denne konvertering skal udføres.
For eksempel hvis du har en "Person"-type defineret som sådan, inklusive en created_at
tidsstempel formateret som RFC3339 (en form for ISO 8601), kan du definere en brugerdefineret "Timestamp"-type med en "RedisScan"-metode som følger:
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)