go - 通过提供值构造自定义类型的 time.Time 返回非预期值

标签 go redis

我正在实现一个方法 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/

相关文章:

在公司网络上变得不安全

go - 如何应对这种进口周期?

algorithm - 通过位操作处理负数

Go类型定义操作 "inheritance"?

redis - 试验 redis 中的关键波动性

python - 组和 channel 层使流程停止而不会引发异常

json - golang 中的 "missing type in composite literal"

redis - Geo-redis,存储附加数据

multithreading - Redis如果是单线程的,怎么会这么快呢?

redis - Spring XD分布式模式redis模板问题