Étant donné que Redis n'a pas de concept de valeurs de temps, cela n'aurait aucun sens pour un pilote générique tel que redigo d'effectuer une conversion automatique entre le time.Time
intégré type et un tableau d'octets arbitraire. En tant que tel, c'est au programmeur de décider comment effectuer cette conversion.
Par exemple, supposons que vous ayez un type "Personne" défini comme tel, incluant un created_at
horodatage au format RFC3339 (une forme d'ISO 8601), vous pouvez définir un type "Timestamp" personnalisé avec une méthode "RedisScan" comme suit :
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)