Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redigo ScanStruct-Fehler mit time.Time

Da Redis kein Konzept für Zeitwerte hat, würde es für einen generischen Treiber wie Redigo keinen Sinn machen, eine automatische Konvertierung zwischen den eingebauten time.Time durchzuführen type und ein beliebiges Byte-Array. Daher muss der Programmierer entscheiden, wie er diese Konvertierung durchführt.

Angenommen, Sie haben einen als solchen definierten Typ „Person“, einschließlich eines created_at timestamp formatiert als RFC3339 (eine Form von ISO 8601), könnten Sie einen benutzerdefinierten „Timestamp“-Typ mit einer „RedisScan“-Methode wie folgt definieren:

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)