首頁  >  文章  >  後端開發  >  為什麼我的自訂時間類型別名在解組時輸出意外結果?

為什麼我的自訂時間類型別名在解組時輸出意外結果?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-28 17:12:02876瀏覽

Why Does My Custom Time Type Alias Output Unexpected Results When Unmarshaling?

自訂時間類型別名的意外輸出

嘗試解組自訂時間類型別名時,產生的輸出可能會出現意外。考慮以下程式碼:

<code class="go">type Time time.Time

func main() {
    // Simplified unmarshal code for brevity
    st := Time(time.Parse(time.RFC3339, "2021-05-21T03:10:20.958450Z"))
    fmt.Printf("%v\n", st)
}</code>

預期格式化時間,輸出顯示以下內容:

&{958450000 63757163420 <nil>}

根本原因

問題在於缺少Time類型的fmt.Stringer 實作。預設情況下,fmt 使用自己的格式化邏輯,該邏輯在大括號中顯示底層時間的欄位。時間值。

要解決此問題,有兩個選項:

  1. 實作fmt.Stringer:

將String 方法加入您的Time 類型,該方法委託給time.Time 的String 方法:

<code class="go">func (t Time) String() string {
    return time.Time(t).String()
}</code>
  1. 嵌入time.Time:

將Time 類型變更為嵌入time.Time 而非別名。這將自動繼承String 方法和time.Time 的所有其他方法:

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

其他改進

  • 始終使用json.Unmarshal 解碼JSON字串以避免手動解析。
  • 考慮使用 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
    }

    *st = Time(t)
    return nil
}</code>

以上是為什麼我的自訂時間類型別名在解組時輸出意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn