Vì Redis không có khái niệm về giá trị thời gian nên sẽ không có ý nghĩa gì đối với một trình điều khiển chung chung như redigo để thực hiện một số chuyển đổi tự động giữa time.Time
nội trang kiểu và một mảng byte tùy ý. Do đó, lập trình viên quyết định cách thực hiện chuyển đổi đó.
Ví dụ:giả sử bạn có một loại "Người" được xác định như vậy, bao gồm một created_at
dấu thời gian được định dạng là RFC3339 (một dạng của ISO 8601), bạn có thể xác định loại "Dấu thời gian" tùy chỉnh bằng phương pháp "RedisScan" như sau:
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)