自訂時間類型別名的意外輸出
嘗試解組自訂時間類型別名時,產生的輸出可能會出現意外。考慮以下程式碼:
<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 使用自己的格式化邏輯,該邏輯在大括號中顯示底層時間的欄位。時間值。
解
要解決此問題,有兩個選項:
將String 方法加入您的Time 類型,該方法委託給time.Time 的String 方法:
<code class="go">func (t Time) String() string { return time.Time(t).String() }</code>
將Time 類型變更為嵌入time.Time 而非別名。這將自動繼承String 方法和time.Time 的所有其他方法:
<code class="go">type Time struct { time.Time }</code>
其他改進
<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中文網其他相關文章!