亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

打印時間時出現意外輸出。時間類型別名

打印時間時出現意外輸出。時間類型別名

Go
蕭十郎 2022-12-26 16:43:19
我正在嘗試為自定義類型編寫解組函數??紤]以下代碼(游樂場)package mainimport (    "encoding/json"    "fmt"    "strings"    "time")type Time time.Timefunc (st *Time) UnmarshalJSON(b []byte) error {    // "2021-05-21T03:10:20.958450" -> "2021-05-21T03:10:20.958450Z"    s := strings.Trim(string(b), "\"")    t, err := time.Parse(time.RFC3339, fmt.Sprintf("%s%s", s, "Z"))    if err != nil {        return fmt.Errorf("parse time: %w", err)    }    *st = Time(t)    return nil}type User struct {    Name string    TS Time}const data = `{"id":3, "name":"Name", "ts":"2021-05-21T03:10:20.958450"}`func main() {    user := new(User)    json.Unmarshal([]byte(data), &user)    fmt.Printf("%v\n", user)}我成功地time.Time從我那里得到了一個有效的價值,time.Parse()但我不太明白為什么要*st = Time(t)給出如此奇怪的價值?目前上面打印出來:&{Name {958450000 63757163420 <nil>}}但我想更類似于:&{Name 2021-05-21 03:10:20.95845 +0000 UTC}我在這里誤解了什么?
查看完整描述

1 回答

?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

與 time.Time 相反,你的類型沒有實現fmt.Stringer,所以 fmt.Print* 函數別無選擇,只能使用它們的默認格式化邏輯,在這種情況下是打印底層 time.Time 值的字段大括號。


將委托給 time.Time.String 的 String 方法添加到您的類型以獲得所需的行為:


func (t Time) String() string {

    return time.Time(t).String()

}

https://go.dev/play/p/5PwOwa49B5X


或者,將您的時間類型更改為嵌入 time.Time。這將自動提升 String 方法以及所有其他方法(例如 Marshal* 方法):


type Time struct {

    time.Time

}


func (st *Time) UnmarshalJSON(b []byte) error {

    // ...

    st.Time = t // simple assignment without type conversion

    return nil

}

https://go.dev/play/p/0H5qyCO22gu


此外,您永遠不應該手動解析 JSON。strings.Trim(string(b), "\"")不足以完全解碼 JSON 字符串值。始終使用 json.Unmarshal。您可以使用 time.ParseInLocation 來簡化。


func (st *Time) UnmarshalJSON(b []byte) error {

    var s string

    if err := json.Unmarshal(b, &s); err != nil {

        return err

    }


    t, err := time.ParseInLocation("2006-01-02T15:04:05", s, time.UTC)

    if err != nil {

        return err

    }


    // ...

}


查看完整回答
反對 回復 2022-12-26
  • 1 回答
  • 0 關注
  • 68 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號