第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

打印時(shí)間時(shí)出現(xiàn)意外輸出。時(shí)間類型別名

打印時(shí)間時(shí)出現(xiàn)意外輸出。時(shí)間類型別名

Go
蕭十郎 2022-12-26 16:43:19
我正在嘗試為自定義類型編寫解組函數(shù)??紤]以下代碼(游樂場)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從我那里得到了一個(gè)有效的價(jià)值,time.Parse()但我不太明白為什么要*st = Time(t)給出如此奇怪的價(jià)值?目前上面打印出來:&{Name {958450000 63757163420 <nil>}}但我想更類似于:&{Name 2021-05-21 03:10:20.95845 +0000 UTC}我在這里誤解了什么?
查看完整描述

1 回答

?
隔江千里

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊

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


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


func (t Time) String() string {

    return time.Time(t).String()

}

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


或者,將您的時(shí)間類型更改為嵌入 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


此外,您永遠(yuǎn)不應(yīng)該手動解析 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

    }


    // ...

}


查看完整回答
反對 回復(fù) 2022-12-26
  • 1 回答
  • 0 關(guān)注
  • 72 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號