我正在实现一个方法 RedisScan(...) 按照这个 SO 回答 Redigo ScanStruct error with time.Time .
我的方法:
func (t *Timestamp) RedisScan(x interface{}) error {
bs, ok := x.([]byte)
if !ok {
return fmt.Errorf("expected []byte but got %T", x)
}
layout := "2006-01-02 15:04:05 -0700 MST"
parsedTime, err := time.Parse(layout, string(bs))
if err != nil {
return err
}
fmt.Println(parsedTime) // 2019-12-10 00:00:00 +0000 UCT
fmt.Println(Timestamp(parsedTime)) // some gibberish....
*t = Timestamp(parsedTime)
return nil
}
这是我的自定义类型
type Timestamp time.Time
问题是当我打印出 解析时间 在我的 RedisScan 方法中,它输出 2019-12-10 00:00:00 +0000 UCT .但是打印出时间戳(解析时间)输出 {0 63714211200 0xc0001591a0} .有人可以解释一下这里发生了什么吗?
最佳答案
这是我希望看到的。 Time.Time 实现了 fmt.Stringer (参见 string() ),各种 fmt 函数将调用它(如果接口(interface)已经实现)。您的 Timestamp 类型没有实现这一点,因此原始结构被转储。
Time.Time 定义为:
type Time struct {
wall uint64
ext int64
loc *Location
}
这些是您看到的三个值。
要解决此问题,您可以使用
fmt.Println(time.Time(parsedTime).Format("2006-01-02 15:04:05 -0700 MST"))
之类的内容。 , 在时间戳或 embed time.Time 中实现 String()进入你的结构。
关于go - 通过提供值构造自定义类型的 time.Time 返回非预期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59699860/