Aangezien Redis geen concept van tijdwaarden heeft, zou het voor een generieke driver zoals redigo geen zin hebben om een automatische conversie uit te voeren tussen de builin time.Time
type en een willekeurige byte-array. Als zodanig is het aan de programmeur om te beslissen hoe die conversie moet worden uitgevoerd.
Stel bijvoorbeeld dat u een type "Persoon" als zodanig hebt gedefinieerd, inclusief een created_at
tijdstempel geformatteerd als RFC3339 (een vorm van ISO 8601), kunt u als volgt een aangepast type "Timestamp" definiëren met een "RedisScan"-methode:
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)