前言
如果一個結構體直接使用 time.Time
做為日期屬性,在接收 JSON 資料時,可能會無法解析來自前端的日期格式,因此需要進一步封裝,並覆寫 UnmarshalJSON()
方法。
做法
假設有一個 Post
結構體:
1 2 3
| type Post struct { ReviewedAt time.Time `json:"reviewedAt"` }
|
自訂一個 Timestamp
類型,並覆寫 UnmarshalJSON
和 Value
方法:
1 2 3 4 5 6 7 8 9 10 11 12
| type Timestamp time.Time
func (t *Timestamp) UnmarshalJSON(data []byte) error { timestamp, err := time.Parse("2006-01-02 15:04:05", strings.Trim(string(data), "\"")) *t = Timestamp(timestamp) return err }
func (t Timestamp) Value() (driver.Value, error) { timestamp := time.Time(t) return timestamp.Format("2006-01-02 15:04:05"), nil }
|
在 Post
結構體使用 Timestamp
類型:
1 2 3
| type Post struct { ReviewedAt Timestamp `json:"reviewedAt"` }
|