Создание пользовательского типа time.Time путем предоставления значений возвращает не ожидаемые значения - PullRequest
0 голосов
/ 12 января 2020

Я реализую метод RedisScan (...) , следуя этому SO-ответу Redi go Ошибка ScanStruct со временем. Время .

Мой метод:

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

Проблема в том, что когда я печатаю parsedTime внутри моего RedisScan метод, он выводит 2019-12-10 00:00:00 +0000 UCT . Но при печати метка времени (parsedTime) выводит {0 63714211200 0xc0001591a0} . Может кто-нибудь объяснить мне, что здесь происходит?

1 Ответ

0 голосов
/ 12 января 2020

Это то, что я ожидал увидеть. Time.Time реализует fmt.Stringer (см. string () ), который будут вызывать различные функции fmt (если интерфейс был реализован). Ваш тип 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")), реализовать String () в Timestamp или embed time.Time в вашей структуре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...