go计划中的时间始终为0

Roo*_*oft 0 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
}
Run Code Online (Sandbox Code Playgroud)

Sim*_*ead 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
}
Run Code Online (Sandbox Code Playgroud)

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

(这工作顺便..不确定它的"最佳实践")