go计划中的时间始终为0

时间:2014-09-24 01:48:41

标签: json go unmarshalling

我正在尝试从Bitfinex API获取交易并在屏幕上打印它们。一切都很好,除了时间。

我想知道为什么他们总是在这个例子中打印为0001-01-01 00:00:00 ...

在UnmarshalJSON中," t"包含我需要的时间。它似乎并没有坚持贸易结构。

package main

import (
        "encoding/json"
        "fmt"
        "io/ioutil"
        "net/http"
        "strconv"
        "time"
)

type Trade struct {
        Tid       int
        Timestamp myTime
}

type myTime time.Time

func (t myTime) String() string {
        when := time.Time(t)
        return when.Format("2006-01-02 15:04:05")
}

func (t myTime) UnmarshalJSON(b []byte) error {
        ts, err := strconv.Atoi(string(b))
        if err != nil {
                return err
        }

        t = myTime(time.Unix(int64(ts), 0))

        return nil
}

func main() {
        trades, _ := GetTrades()

        for _, trade := range trades {
                fmt.Printf("%d - %s\n", trade.Tid, trade.Timestamp)
        }
}

func GetTrades() (trades []Trade, err error) {
        r, err := http.Get("https://api.bitfinex.com/v1/trades/BTCUSD")
        defer r.Body.Close()

        body, _ := ioutil.ReadAll(r.Body)
        json.Unmarshal(body, &trades)

        return
}

2 个答案:

答案 0 :(得分:5)

您可以在指针接收器上解组..否则您只是复制不相关的数据:

func (t *myTime) UnmarshalJSON(b []byte) error {
    //  ^^^^^^^ this
    ts, err := strconv.Atoi(string(b))
    if err != nil {
            return err
    }

    *t = myTime(time.Unix(int64(ts), 0))
 // ^^ this too

    return nil
}

我不确定"安全" /"惯用"这是在指针接收器中重新分配数据..有人可以澄清吗?

(这很有效..不确定它的"最佳实践")

答案 1 :(得分:1)

你不能在UnmarshalJSON中赋值,你必须使用指针或结构,一种方法是:

type MyTime struct {
    time.Time
}

func (t MyTime) String() string {
    when := time.Time(t.Time)
    return when.Format("2006-01-02 15:04:05")
}

func (t *MyTime) UnmarshalJSON(b []byte) error {
    ts, err := strconv.Atoi(string(b))
    if err != nil {
        return err
    }
    t.Time = time.Unix(int64(ts), 0)

    return nil
}