猿问

在 Go 程序中时间总是 0

我在这里尝试从 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

}


慕婉清6462132
浏览 273回答 2
2回答

梦里花落0921

您可以在指针接收器上解组 .. 否则您只是在复制不相关的数据: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}我不确定在指针接收器中重新分配数据有多“安全”/“惯用”..有人可以澄清吗?(顺便说一句,这有效......不确定它是否是“最佳实践”)

隔江千里

您不能分配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}
随时随地看视频慕课网APP

相关分类

Go
我要回答