首頁 > 後端開發 > Golang > 主體

為什麼在 Go 中列印自訂 Time 類型別名會產生意外輸出,如何修正?

Patricia Arquette
發布: 2024-10-30 15:18:42
原創
333 人瀏覽過

Why does printing a custom Time type alias in Go produce unexpected output, and how can it be corrected?

列印 Time.Time 型別別名時出現意外輸出

在 Go 中,列印自訂 Time 型別別名時可能會遇到意外輸出。了解行為需要進一步剖析問題。

理解問題

考慮以下程式碼:

<code class="go">package main
import (
    "encoding/json"
    "fmt"
    "strings"
    "time"
)

type Time time.Time

func (st *Time) UnmarshalJSON(b []byte) error {
    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)
}</code>
登入後複製

執行此程式碼時,預期輸出是格式化的時間值,類似:

&{Name 2021-05-21 03:10:20.95845 +0000 UTC}
登入後複製

但是,實際輸出顯示為:

&{Name {958450000 63757163420 <nil>}}
登入後複製

解釋不正確的輸出

出現差異是因為Time 類型別名不實作fmt.Stringer,導致預設格式化邏輯接管。此邏輯列印以大括號括起來的底層 time.Time 值的欄位。

修正輸出

要解決此問題,請在委託給 time.Time.String 的 Time 類型中實作 String 方法。這將啟用所需的格式化輸出:

<code class="go">func (t Time) String() string {
    return time.Time(t).String()
}</code>
登入後複製

替代解決方案

另一個選項是將 time.Time 嵌入到 Time 類型中。這會自動提升 String 方法和其他方法(包括 Marshal*)。

<code class="go">type Time struct {
    time.Time
}

func (st *Time) UnmarshalJSON(b []byte) error {
    // ... unchanged ...
    st.Time = t // simple assignment without type conversion
    // ... unchanged ...
}</code>
登入後複製

其他注意事項

解析 JSON 時,避免使用 strings.Trim 手動解析;相反,使用 json.Unmarshal 進行正確解碼。此外,使用 time.ParseInLocation:

<code class="go">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
    }

    // ... unchanged ...
}</code>
登入後複製
簡化時間解析

以上是為什麼在 Go 中列印自訂 Time 類型別名會產生意外輸出,如何修正?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!