Redis
 sql >> Database >  >> NoSQL >> Redis

Errore Redigo ScanStruct con time.Time

Dal momento che Redis non ha il concetto di valori temporali, non avrebbe senso che un driver generico come redigo esegua una conversione automatica tra il builin time.Time tipo e un array di byte arbitrario. In quanto tale, spetta al programmatore decidere come eseguire tale conversione.

Ad esempio, supponiamo che tu abbia un tipo "Persona" definito come tale, incluso un created_at timestamp formattato come RFC3339 (una forma di ISO 8601), puoi definire un tipo "Timestamp" personalizzato con un metodo "RedisScan" come segue:

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)