Redis
 sql >> Base de données >  >> NoSQL >> Redis

Erreur Redigo ScanStruct avec time.Time

É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)