Karena Redis tidak memiliki konsep nilai waktu, maka tidak masuk akal bagi driver generik seperti redigo untuk melakukan beberapa konversi otomatis antara time.Time
bawaan. ketik dan array byte arbitrer. Karena itu, pemrogram harus memutuskan bagaimana melakukan konversi tersebut.
Misalnya, Andaikan Anda memiliki tipe "Orang" yang didefinisikan seperti itu, termasuk created_at
stempel waktu yang diformat sebagai RFC3339 (bentuk ISO 8601), Anda dapat menentukan jenis "Stempel Waktu" khusus dengan metode "RedisScan" sebagai berikut:
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)