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

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

Mary-Kate Olsen
發布: 2024-10-28 17:12:02
原創
885 人瀏覽過

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中文網其他相關文章!

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