sql >> Base de Datos >  >> NoSQL >> Redis

Error de Redigo ScanStruct con time.Time

Dado que Redis no tiene un concepto de valores de tiempo, no tendría sentido que un controlador genérico como redigo realizara alguna conversión automática entre el time.Time integrado. tipo y una matriz de bytes arbitraria. Como tal, depende del programador decidir cómo realizar esa conversión.

Por ejemplo, suponga que tiene un tipo de "Persona" definido como tal, incluido un created_at marca de tiempo con formato RFC3339 (una forma de ISO 8601), puede definir un tipo de "marca de tiempo" personalizado con un método "RedisScan" de la siguiente manera:

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)